[
  {
    "path": ".babelrc",
    "content": "{\n  \"presets\": [\"@babel/preset-env\"],\n  \"ignore\": [\n    \"**/babel_ignore_*.js\",\n    \"*/js/framework/*.js\",\n    \"*/js/libraries/*.js\",\n    \"*/js/plugins/*.js\",\n    \"*/js/separate-js/*.js\"\n  ]\n}\n"
  },
  {
    "path": ".browserslistrc",
    "content": "> 1%\nlast 2 versions\nFirefox ESR\nandroid 4\n"
  },
  {
    "path": ".editorconfig",
    "content": "# editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 4\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[node_modules/**.js]\ncodepaint = false\n\n[package.json]\nindent_style = space\nindent_size = 2"
  },
  {
    "path": ".eslintignore",
    "content": "**/_*.js\nplugins-config.json\n"
  },
  {
    "path": ".eslintrc",
    "content": "{\n\n    \"root\": true,\n\n    \"env\": {\n        \"node\": true,\n        \"browser\": true,\n        \"commonjs\": true,\n        \"jquery\": true,\n        \"es6\": true\n    },\n\n    \"globals\": {\n        \"tars\": true\n    },\n\n    \"extends\": \"eslint:recommended\",\n\n\n    \"parserOptions\": {\n        \"ecmaVersion\": 6,\n        \"sourceType\": \"module\"\n    },\n\n    \"rules\": {\n        \"indent\": [2, 4, {\"SwitchCase\": 1}],\n        \"brace-style\": [2, \"1tbs\"],\n        \"camelcase\": [2, { \"properties\": \"always\" }],\n        \"comma-spacing\": [2, {\"before\": false, \"after\": true}],\n        \"comma-style\": [2, \"last\"],\n        \"consistent-return\": 0,\n        \"curly\": [2, \"all\"],\n        \"default-case\": 2,\n        \"dot-notation\": [2, { \"allowKeywords\": true }],\n        \"eol-last\": 2,\n        \"eqeqeq\": [2, \"smart\"],\n        \"guard-for-in\": 2,\n        \"key-spacing\": [2, { \"beforeColon\": false, \"afterColon\": true }],\n        \"new-cap\": 2,\n        \"new-parens\": 2,\n        \"no-alert\": 2,\n        \"no-array-constructor\": 2,\n        \"no-caller\": 2,\n        \"no-debugger\": 0,\n        \"no-delete-var\": 2,\n        \"no-eval\": 0,\n        \"no-extra-bind\": 2,\n        \"no-fallthrough\": 2,\n        \"no-floating-decimal\": 2,\n        \"no-implied-eval\": 2,\n        \"no-invalid-this\": 1,\n        \"no-iterator\": 2,\n        \"no-label-var\": 2,\n        \"no-labels\": 2,\n        \"no-lone-blocks\": 2,\n        \"no-loop-func\": 1,\n        \"no-mixed-spaces-and-tabs\": [2, false],\n        \"no-multi-spaces\": 2,\n        \"no-multi-str\": 2,\n        \"no-native-reassign\": 2,\n        \"no-nested-ternary\": 2,\n        \"no-new-func\": 2,\n        \"no-new-object\": 2,\n        \"no-new-wrappers\": 2,\n        \"no-octal\": 2,\n        \"no-octal-escape\": 2,\n        \"no-process-exit\": 2,\n        \"no-proto\": 2,\n        \"no-redeclare\": 2,\n        \"no-return-assign\": 2,\n        \"no-script-url\": 2,\n        \"no-sequences\": 2,\n        \"no-shadow\": 2,\n        \"no-shadow-restricted-names\": 2,\n        \"no-spaced-func\": 2,\n        \"no-trailing-spaces\": 2,\n        \"no-undef\": 2,\n        \"no-undef-init\": 2,\n        \"no-undefined\": 2,\n        \"no-unused-expressions\": 2,\n        \"no-unused-vars\": [1, {\"vars\": \"all\", \"args\": \"after-used\"}],\n        \"no-use-before-define\": 2,\n        \"no-with\": 2,\n        \"quotes\": [2, \"single\"],\n        \"radix\": 2,\n        \"semi\": [2, \"always\"],\n        \"semi-spacing\": [2, {\"before\": false, \"after\": true}],\n        \"keyword-spacing\": 2,\n        \"space-before-blocks\": [2, \"always\"],\n        \"space-before-function-paren\": [2, {\"anonymous\": \"always\", \"named\": \"never\"}],\n        \"space-infix-ops\": 2,\n        \"space-unary-ops\": [2, {\"words\": true, \"nonwords\": false}],\n        \"spaced-comment\": [2, \"always\", { \"exceptions\": [\"-\"]}],\n        \"strict\": 0,\n        \"valid-jsdoc\": [0, {\"requireReturnDescription\": false, \"requireReturn\": false}],\n        \"wrap-iife\": [2, \"inside\"],\n        \"yoda\": [2, \"never\"],\n\n        // Previously on by default in node environment\n        \"no-catch-shadow\": 0,\n        \"no-console\": 0,\n        \"no-mixed-requires\": 2,\n        \"no-new-require\": 2,\n        \"no-path-concat\": 2,\n        \"global-strict\": [0, \"always\"],\n        \"handle-callback-err\": [2, \"err\"],\n\n        // ES6\n        \"arrow-spacing\": [2, {\"before\": true, \"after\": true}],\n        \"constructor-super\": 2,\n        \"no-confusing-arrow\": 2,\n        \"no-class-assign\": 2,\n        \"no-const-assign\": 2,\n        \"no-dupe-class-members\": 2,\n        \"no-this-before-super\": 2,\n        \"prefer-arrow-callback\": 0,\n        \"prefer-template\": 0,\n        \"require-yield\": 2,\n        \"no-var\": 1\n    }\n}\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\ndev\n.DS_Store\n._.DS_Store\n\n.tmpTemplater\n.tmpPreproc\n\n.idea\nnpm-debug.log\nphantomjsdriver.log\n/nbproject/*\n\n**/sprite_96.*\n**/svg-fallback-sprite.*\n**/svg-sprite.*\n\n.vscode\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: c\n\nos:\n    - linux\n    - osx\n\nenv:\n    matrix:\n        - export NODE_VERSION=\"16\"\n\nmatrix:\n    fast_finish: true\n\nbefore_install:\n    - echo $TRAVIS_OS_NAME\n    - 'export TRAVIS_COMMIT_MSG=\"$(git log --format=%B --no-merges -n 1)\"'\n    - export START_FULL_TESTS=$(echo $TRAVIS_COMMIT_MSG | grep '\\[full\\]' -c)\n    - if [ ${START_FULL_TESTS} = \"1\" ]; then echo \"FULL TESTS!\"; fi\n    - git clone https://github.com/creationix/nvm.git ./.nvm\n    - source ./.nvm/nvm.sh\n    - nvm install $NODE_VERSION\n    - nvm use $NODE_VERSION\n\nbefore_script:\n    - npm -v\n    - npm install\n    - npm install -g gulp\n\nscript:\n    - gulp init\n    - gulp --release --ie\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014-2016, Malko Artem <artem.malko@gmail.com>, <tars.builder@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"README_RU.md\">Описание на русском</a>\n</p>\n\n# Maintainer is needed!\n\n# ![Tars](https://raw.githubusercontent.com/artem-malko/artwork/master/tars/logo.png)\n\n[![Downloads][downloads-image]][npm-url] [![Mac/Linux Build Status](https://img.shields.io/travis/tars/tars/master.svg?label=Mac%20OSX%20%26%20Linux&style=flat-square)](https://travis-ci.org/tars/tars) [![Windows Build status](https://img.shields.io/appveyor/ci/artem-malko/tars/master.svg?label=Windows&style=flat-square)](https://ci.appveyor.com/project/artem-malko/tars/branch/master) [![Gitter](https://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg?style=flat-square)](https://gitter.im/tars/tars?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)\n\nTARS is a builder for modern frontend of any complexity, which is based on [Gulp.js](http://gulpjs.com/). It facilitates and accelerates process of web-development. TARS will be suitable for teams and individual developers. It solves the most routine cases associated with web-development and brings you more pleasure from work.\n\nTARS is a framework for gulp, including a set of gulp-tasks. It allows for easy expansion (creating new tasks) and customization (modification of existing tasks),  provides comfortable architecture for tasks and watchers storage in the project. \n\nTo bypass dependencies installation for every TARS project, [TARS-CLI](https://github.com/tars/tars-cli) was created. As such, TARS is not a npm-package by itself. This decision was made so that everyone could comfortably customize the builder for themselves. TARS-CLI is just a simple builder interface, which includes all dependencies for TARS.\n\n**It is strongly recommended to use TARS-CLI for development.**\n\nYou can install TARS-CLI via NPM. More info in [project's repository](https://github.com/tars/tars-cli).\n\n**Attention! All docs from branch \"master\" are written for the last version of TARS. If you have another version of TARS, please, open appropriate release and take docs from there. Besides, you have all docs, which are 100% compatible with your project in the root folder of your project!**\n\n## Basic features\n\nListed below are just a little part of the features. In fact builder has much more.\n\n* [Jade](http://jade-lang.com/), [Pug](https://pugjs.org/api/getting-started.html) or [Handlebars](http://handlebarsjs.com/) as html templater. You can also use a regular html. Read more [in docs](/docs/en/html-processing.md).\n* [Webpack](https://webpack.github.io) (with [Hot Module Replacing](https://webpack.github.io/docs/hot-module-replacement.html)) or simple JavaScript code concatenation into one bundle.\n* Using json (js-object actually, which can be described in json) to transfer data in templates (optional, but it is a very cool thing that will let you get rid of copypaste). Read more [in docs](/docs/en/html-processing.md#%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F%D0%BC%D0%B8-%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8-%D0%B2-handlebars).\n* [TARS-CLI](https://github.com/tars/tars-cli) and **auto update of your project**.\n* You can use ES6 (and some experimental features from ES7) right now. [More info](/docs/en/js-processing.md).\n* [SCSS (SASS)](http://sass-lang.com/), [LESS](http://www.lesscss.org/) or [Stylus](http://learnboost.github.io/stylus/) as a preprocessor for css. Also it includes a small set of mixins. Sourcemaps are included. You can use .scss and .sass extension then scss is selected as preprocessor. You can use .scss and .sass files together. Read more [in docs](/docs/en/css-processing.md). [PostCSS](https://github.com/postcss/postcss) with [autoprefixer](https://github.com/postcss/autoprefixer) is supported by default and it is really easy [to use additional plugins for PostCSS](/docs/en/options.md#postcss).\n* No external libraries or plugins (except [html5shiv](https://ru.wikipedia.org/wiki/Html5_Shiv)). Yes, this is a feature because you can choose which library to use. Sourcemaps for JavaScript are included.\n* [Chokidar](https://github.com/paulmillr/chokidar) module is used to watch files\n* Optional markup sharing from your local computer to the world. And of course it has livereload in browser (and not just locally) + GUI control panel for devices, to which markup is shared.\n* [You can easily add new tasks and watchers](/docs/en/tasks-and-watchers.md). There are several examples of how to create and use a new task or watcher inside the TARS. Thereby, it is really easy to add any task from your builder to TARS or integrate TARS into your project.\n* Smart work with images. First of all with vector (svg). There will be no more hell with markup for screens with high pixel density. TARS supports two workflows of working with SVG: [SVG-sprites](docs/en/svg-processing.md#svg-sprites) and [SVG-symbols](docs/en/svg-processing.md#svg-symbols).\n* Several modes of assembly (common, with minified files, with hash in the title of css and js files for deployment).\n* Creating archive with a complete build.\n\n## Documentation\n\nIt is important! All examples in documentation use the default settings.\n\n* [File structure](/docs/en/file-structure.md)\n* [Working with tasks and watchers](/docs/en/tasks-and-watchers.md)\n* [TARS Options](/docs/en/options.md)\n* [Plugins configuration](/docs/en/plugins-options.md)\n* [Html](/docs/en/html-processing.md)\n* [Css](/docs/en/css-processing.md)\n* [Js](/docs/en/js-processing.md)\n* [Working with images](/docs/en/images-processing.md)\n* [Working with fonts and misc-files](/docs/en/fonts-and-misc.md)\n* [Usage script (scenarios)](/docs/en/scenarios.md)\n* [Upgrade guide](/docs/en/update-guide.md)\n* [FAQ](/docs/en/faq.md)\n\n\n## Installation\n\n**Attention, [TARS-CLI](https://github.com/tars/tars-cli) is the preferred\n way to work with TARS. It is faster and more comfortable to work with TARS-CLI. In case of using TARS with TARS-CLI all installation steps are not necessary!**\n\nYou need to [install `Node.js`](http://nodejs.org/) with version equal to 4.x.x and higher. If you use Node.js version 5.x.x, please, make sure, that you use npm version 3.x.x and higher. Otherwise update npm by using command:\n\n```bash\nnpm i -g npm\n```\n\nFor Windows you have to do some more steps:\n\n* navigate to C:\\Program Files (x86)\\nodejs or C:\\Program Files\\nodejs via cmd.exe or any available terminal. The path depends on how Node.js was installed;\n* run command `npm install npm@latest`.\n\nIf you get a **Permission denied** or **Error: EACCES** error, you should run the previous command again in sudo (as Administrator for Windows).\n\nNext you need to install gulp globally. (You may need rights of superuser or administrator).\n\n```shell\nnpm install -g gulp\n```\n\n[Download TARS](../../../tars/archive/master.zip) and unzip it in the working directory. Then install dependencies. Command is run from a folder with TARS files (usually it is a tars-master).\n\n```shell\nnpm install\n```\n\nIf not all of the dependencies have been installed, the last operation must be repeated. \n\nAfter installing of all dependencies you need to open tars-config (detailed description of the options are [here](/docs/en/options.md)) and set up the project for yourself. In that config file, you can select the templater, css-preprocessor, using the notifications, folder names for different static and etc. After setting up the project, execute the following command:\n\n```shell\ngulp init\n```\n\n**Attention, [TARS-CLI](https://github.com/tars/tars-cli) is the preferred \nway to work with TARS. It is faster and more comfortable to work with TARS-CLI. [Init command is available in TARS-CLI too](https://github.com/tars/tars-cli/blob/master/docs/en/commands.md#tars-init).**\n\nThis command will create the basic file structure, download tasks for selected templater and css-preprocessor. \nEverything is ready, get to work! :)\n\n\n## Basic commands\n\n**Attention, [TARS-CLI](https://github.com/tars/tars-cli) is the preferred\n way to work with TARS. It is faster and more comfortable to work with TARS-CLI. All commands are available and [described in TARS-CLI](https://github.com/tars/tars-cli/blob/master/docs/en/commands.md), so use only TARS-CLI for working with your project. TARS used Gulp to start tasks, when CLI was not created.**\n\n`gulp init` — initializes project with the specified settings in the tars-config. Creates a file structure.\n\n`gulp re-init` — **This command is deprecated!** reinitialize the project with specified settings in the tars-config. It is advised to use this command if you initialize the project with incorrect options. **Attention, files from pages and static folder will be deleted.**\n\n`gulp` or `gulp build` — build project. Non-minimized files are used by default. Build type depends on command parameters.\nAvailable parameters:\n\n* `--min` – minimized files are connected to html.\n* `--release` – minimized  files are connected to html whose names have hash. This mode is useful if you are trying to directly deploy ready markup to the server.\n\n`gulp dev` — initialize of builder in development mode. Dev-version of the project is created  without any minifications. It also launches watchers for project files.\nAvailable parameters:\n\n* `--lr` – initialize livereload (live page reloads with changes in project files), if it is included in the configuration of the project.\n* `--tunnel` – initialize project with markup sharing to the external web.\n\nThe link will be shown in the console. There also will be a link to the control panel for devices to which markup is shared.\n\n`gulp build-dev` — generation of dev-version of the project without watchers.\n\nThese parameters are available in any mode of assembly:\n\n* `--ie8` – to include in the build styles for ie8.\n* `--ie9` – to include in the build styles for ie9.\n* `--ie` – to include in the build styles for ie8 and ie9.\n\n\n## Documentation\n\nIt is important! All examples in documentation use the default settings.\n\n* [File structure](/docs/en/file-structure.md)\n* [Working with tasks and watchers](/docs/en/tasks-and-watchers.md)\n* [TARS Options](/docs/en/options.md)\n* [Plugins configuration](/docs/en/plugins-options.md)\n* [Html](/docs/en/html-processing.md)\n* [Css](/docs/en/css-processing.md)\n* [Js](/docs/en/js-processing.md)\n* [Working with images](/docs/en/images-processing.md)\n* [Working with fonts and misc-files](/docs/en/fonts-and-misc.md)\n* [Usage script (scenarios)](/docs/en/scenarios.md)\n* [Upgrade guide](/docs/en/update-guide.md)\n* [FAQ](/docs/en/faq.md)\n\n\n## Last changes\n\nAll recent changes are available here: [changelog](/docs/en/changelog.md).\n\nIf you have a question you can write in [gitter](https://gitter.im/tars/tars?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) or mail [tars.builder@gmail.com](mailto:tars.builder@gmail.com)\n\nBugs and feature-request here: [issues](https://github.com/tars/tars/issues/new).\n\n[downloads-image]: http://img.shields.io/npm/dm/tars-cli.svg?style=flat-square\n[npm-url]: https://npmjs.org/package/tars-cli\n"
  },
  {
    "path": "README_RU.md",
    "content": "<p align=\"right\">\n<a href=\"README.md\">English description</a> | Описание на русском\n</p>\n\n# Ищем Maintainer'ов\n\n# ![Tars](https://raw.githubusercontent.com/artem-malko/artwork/master/tars/logo.png)\n\n[![Downloads][downloads-image]][npm-url] [![Mac/Linux Build Status](https://img.shields.io/travis/tars/tars/master.svg?label=Mac%20OSX%20%26%20Linux&style=flat-square)](https://travis-ci.org/tars/tars) [![Windows Build status](https://img.shields.io/appveyor/ci/artem-malko/tars/master.svg?label=Windows&style=flat-square)](https://ci.appveyor.com/project/artem-malko/tars/branch/master) [![Gitter](https://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg?style=flat-square)](https://gitter.im/tars/tars?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)\n\nTARS — сборщик frontend'а любой сложности, основанный на [Gulp](http://gulpjs.com/). Облегчает и ускоряет процесс разработки веб-сайтов/приложений, делая работу приятной и продуктивной.\nПодойдет как командам, так и отдельному разработчику. TARS решает большинство рутинных дел, связанных с веб-разработкой, чтобы вы получали больше удовольствия от работы.\n\nTARS — сборщик-фреймворк, включающий в себя набор gulp-тасков, предоставляющий возможность легкого расширения (создания новых тасков) и модифицирования уже существующих, предоставляет удобную архитектуру хранения тасков и вотчеров в проекте.\n\nДля того, чтобы не скачивать и не ставить все пакеты для TARS каждый раз, был создан [TARS-CLI](https://github.com/tars/tars-cli). Сам TARS — не npm-пакет. Такое решение было принято, чтобы каждый мог максимально комфортно кастомизировать сборщик под себя. CLI — просто удобный интерфейс над сборщиком, который содержит в себе все зависимости для TARS.\n\n**Желательно пользоваться именно CLI-версией для разработки.**\n\nВы можете установить TARS-CLI через npm. Больше информации в [репозитории проекта](https://github.com/tars/tars-cli).\n\n**Обратите внимание, документация, которая находится в ветке «master» соответствует последней версии TARS. Если у вас используется другая версия, прошу открыть соответствующий релиз и смотреть документацию там! Кроме того, в корневой папке вашего проекта всегда есть папка с документацией, которая на 100% подходит к используемой версии TARS!**\n\n## Основные фичи\n\nНиже перечислена только малая часть особенностей, на самом деле их гораздо больше)\n\n* [Jade](http://jade-lang.com/), [Pug](https://pugjs.org/api/getting-started.html) или [Handlebars](http://handlebarsjs.com/) на выбор в качестве html-шаблонизатора. Также можно использовать обычный html. Подробности [здесь](/docs/ru/html-processing.md).\n* [Webpack](https://webpack.github.io) (вместе с [Hot Module Replacing](https://webpack.github.io/docs/hot-module-replacement.html)) или простая конкатинация JavaScript-кода в один файл.\n* Использование json (а точнее js-объекта, который может быть описан в json) для передачи данных в шаблоны (опционально, но очень крутая штука, которая позволит избавиться от копипаста). Подробнее [тут](/docs/ru/html-processing.md#%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F%D0%BC%D0%B8-%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8-%D0%B2-handlebars).\n* [CLI-утилита](https://github.com/tars/tars-cli) и **автообновление проекта**.\n* Вы можете ипользовать ES6 (и некоторые фичи из ES7) уже сегодня. Подробнее в [документации](/docs/ru/js-processing.md).\n* [SCSS (SASS)](http://sass-lang.com/), [LESS](http://www.lesscss.org/) или [Stylus](http://learnboost.github.io/stylus/) в качестве препроцессора для css. Также в комплекте идет небольшой набор миксинов. Доступны sourcemaps. При выборе scss в качестве препроцессора, вы можете использовать как расширение scss, так и sass + можете миксовать их использование. Подробности [здесь](/docs/ru/css-processing.md). В комплекте идет [PostCSS](https://github.com/postcss/postcss) с [autoprefixer'ом](https://github.com/postcss/autoprefixer). Также очень [легко подключить дополнительные плагины для PostCSS](/docs/ru/options.md#postcss).\n* Никаких внешних библиотек и плагинов (кроме [html5shiv](https://ru.wikipedia.org/wiki/Html5_Shiv)). И да, это фича, так как вы вольны сами выбирать, какие библиотеки использовать. Доступны sourcemaps для JavaScript.\n* Используется модуль [chokidar](https://github.com/paulmillr/chokidar) для вотчинга файлов.\n* Расшариванием верстки с вашего компьютера во внешний веб, опционально. Ну и конечно же livereload в браузере (и не только локально) + графический интерфейс к панели управления устройствами, на которые расшаривается верстка.\n* [Можно легко добавлять новые таски и вотчеры](/docs/ru/tasks-and-watchers.md). Есть примеры того, как создать и использовать новый таск или вотчер внутри TARS. Это позволяет действительно легко интегрировать TARS в ваш проект или таски из вашего проекта в TARS.\n* Умная работа с изображениями. В первую очередь с вектором (svg). Больше не будет ада при верстке сайтов для экранов с высокой плотностью пикселей. Для работы с SVG поддерживаются два подхода: [SVG-спрайты](docs/en/svg-processing.md#svg-спрайты) и [SVG-symbols](docs/ru/svg-processing.md#svg-symbols).\n* Несколько режимов сборки (обычная, с минифицированными файлами, с хешем в названии css- и js-файлов для выкладки в продакшн).\n* Создание архива с готовой сборкой.\n\nВ 2015 году я выступал с докладом о TARS на конференции DUMP. Можно ознакомиться с [видео с выступления](http://www.youtube.com/watch?v=JZ3thYdmQ3E&index=2&list=PLRdS-n5seLRrvvG0yU3uoYPKQDXvVW2nn), на котором рассказывается об одной из первых версий TARS, но оно все еще актуально.\n\n## Документация\n\nВажно! Все примеры в документации используют настройки по умолчанию.\n\n* [Файловая структура](/docs/ru/file-structure.md)\n* [Работа с тасками и вотчерами](/docs/ru/tasks-and-watchers.md)\n* [Опции TARS](/docs/ru/options.md)\n* [Конфигурирование плагинов](/docs/ru/plugins-options.md)\n* [Html](/docs/ru/html-processing.md)\n* [Css](/docs/ru/css-processing.md)\n* [Js](/docs/ru/js-processing.md)\n* [Работа с изображениями](/docs/ru/images-processing.md)\n* [Работа со шрифтами и misc-файлами](/docs/ru/fonts-and-misc.md)\n* [Сценарии использования](/docs/ru/scenarios.md)\n* [Руководство по обновлению](/docs/ru/update-guide.md)\n* [Руководство для контрибуторов](/docs/ru/for-contributors.md)\n* [FAQ](/docs/ru/faq.md)\n\n## Установка\n\n**Обращаем ваше внимание, что предпочтительно использовать [TARS-CLI](https://github.com/tars/tars-cli). Это удобнее, нагляднее, занимает меньше места. При работе с TARS через TARS-CLI, все дальнейшие шаги по установке не требуются!**\n\nНеобходимо [установить `Node.js`](http://nodejs.org/) версии >= 4.x.x Если вы используете Node.js версии 5.x.x, убедитесь, что вы используете npm версии 3.x.x и выше. В противном случае обновите npm:\n\n```bash\nnpm i -g npm\n```\n\nПользователям Windows необходимо выполнить еще пару шагов:\n\n* перейти в C:\\Program Files (x86)\\nodejs или C:\\Program Files\\nodejs в cmd.exe или в любом другом терминале. Путь зависит от того, куда Node.js был установлен;\n* запустите команду `npm install npm@latest`.\n\nВозможно потребуются права суперюзера.\n\nДалее необходимо установить gulp глобально. (Возможно потребуются права суперюзера или администратора)\n\n```shell\nnpm install -g gulp\n```\n\n[Скачайте TARS](../../../tars/archive/master.zip) и распакуйте в рабочую директорию у себя на компьютере.\nЗатем устанавливаем зависимости. Команда запускается из папки с файлами TARS (обычно это tars-master).\n\n```shell\nnpm install\n```\n\nЕсли не все зависимости были установлены, то последнюю операцию нужно повторить.\n\nПосле установки всех зависимостей необходимо открыть tars-config (подробное описание опций [здесь](/docs/ru/options.md)) и настроить проект под себя.\nВ конфиге вы можете выбрать шаблонизатор, css-препроцессор, использование уведомлений, имена папок для различной статики и т.д.\nПосле настройки проекта, выполняем следующую команду:\n\n```shell\ngulp init\n```\n\n**Обращаем ваше внимание, что предпочтительно использовать [TARS-CLI](https://github.com/tars/tars-cli). [Команда инициализации доступна в TARS-CLI](https://github.com/tars/tars-cli/blob/master/docs/ru/commands.md#tars-init).**\n\nДанная команда создаст базовую файловую структуру, подтянет таски для выбранных вами шаблонизатора и css-препроцессора.\n\nВсе готово, можно колбасить :)\n\n\n## Основные команды\n\n**Обращаем ваше внимание, что предпочтительно использовать [TARS-CLI](https://github.com/tars/tars-cli). Это удобнее, нагляднее, занимает меньше места! Все команды, описанные ниже, [доступны в TARS-CLI](https://github.com/tars/tars-cli/blob/master/docs/ru/commands.md), используйте именно его для работы над проектом. TARS запускался через Gulp, когда не было CLI.**\n\n`gulp init` — Инициализирует проект с заданными опциями в tars-config. Создает файловую структуру.\n\n`gulp re-init` — **команда будет удалена в одном из следующих релизов** Переинициализирует проект с заданными опциями в tars-config. Предлагается использовать данную команду, если вы инициализировали проект с неверными опциями. **Внимание, при переинициализации все папки и файлы удаляются.**\n\n`gulp` или `gulp build` — делает сборку проекта. Подключаются не минимизированные файлы. Тип сборки зависит от переданных ключей вместе с этой командой. Доступные ключи:\n\n* `--min` – в html подключаются минимизированные файлы.\n* `--release` – в html подключаются минимизированные файлы, в названии которых есть hash. Данный режим полезен, если вы напрямую выкладываете верстку на сервер. \n\n`gulp dev` — инициализация сборщика в режиме разработки. Создается dev-версия проекта, без всех минификаций. Также запускает вотчеры за файлами проекта. Доступные ключи:\n\n* `--lr` – инициализация livereload (живая презагрузка страницы при изменениях в файлах проекта), если он включен в конфиге проекта.\n* `--tunnel` – инициализация проекта с расшариванием верстки во внешний веб.\n\nСсылка будет указана в консоли. Также будет указана ссылка на панель управления устройствами, на которые расшарена верстка.\n\n`gulp build-dev` — генерация dev-версии проекта без вотчеров.\n\nКлючи, доступные при любом режиме сборки:\n\n* `--ie8` – включить в сборку стили для ie8.\n* `--ie9` – включить в сборку стили для ie9.\n* `--ie` – включить в сборку стили для ie9 и ie8.\n\n\n## Документация\n\nВажно! Все примеры в документации используют настройки по умолчанию.\n\n* [Файловая структура](/docs/ru/file-structure.md)\n* [Работа с тасками и вотчерами](/docs/ru/tasks-and-watchers.md)\n* [Опции TARS](/docs/ru/options.md)\n* [Конфигурирование плагинов](/docs/ru/plugins-options.md)\n* [Html](/docs/ru/html-processing.md)\n* [Css](/docs/ru/css-processing.md)\n* [Js](/docs/ru/js-processing.md)\n* [Работа с изображениями](/docs/ru/images-processing.md)\n* [Работа со шрифтами и misc-файлами](/docs/ru/fonts-and-misc.md)\n* [Сценарии использования](/docs/ru/scenarios.md)\n* [Руководство по обновлению](/docs/ru/update-guide.md)\n* [Руководство для контрибуторов](/docs/ru/for-contributors.md)\n* [FAQ](/docs/ru/faq.md)\n\n\n## Последние изменения\n\nВсе последние изменения доступны по ссылке: [История изменений](/docs/ru/changelog.md).\n\nПо всем вопросам можно писать в [gitter](https://gitter.im/tars/tars?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) или на почту [tars.builder@gmail.com](mailto:tars.builder@gmail.com)\n\nБаги и фича-реквесты сюда: [issues](https://github.com/tars/tars/issues/new).\n\n[downloads-image]: http://img.shields.io/npm/dm/tars-cli.svg?style=flat-square\n[npm-url]: https://npmjs.org/package/tars-cli\n"
  },
  {
    "path": "appveyor.yml",
    "content": "# AppVeyor file\n# http://www.appveyor.com/docs/appveyor-yml\n\n# Build version format\nversion: '{build}'\n\nplatform:\n    - x64\n    - x86\n\nclone_depth: 10\n\n# Fix line endings on Windows\ninit:\n    - git config --global core.autocrlf true\n\n# What combinations to test\nenvironment:\n    matrix:\n        - nodejs_version: 16\n\ninstall:\n    - ps: Install-Product node $env:nodejs_version $env:platform\n    - node --version\n    - npm install -g npm\n    - npm --version\n    - npm install -g gulp\n    - npm install\n\nbuild: off\n\nbuild_script:\n    - gulp init\n\ntest_script:\n    - cmd: gulp build --release --ie\n"
  },
  {
    "path": "docs/en/changelog.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/changelog.md\">Описание на русском</a>\n</p>\n\n# Changelog\n\n## Version 1.9.9\n\n* Fix bugs: #343\n\n## Version 1.9.8\n\n* Dependencies update.\n* Fix bugs: #318,#324, #336, #325\n\n## Version 1.9.7\n\n* Added webpack [ProvidePlugin](https://webpack.github.io/docs/list-of-plugins.html#provideplugin) support. This is optional, see [tars-config](https://github.com/tars/tars/blob/master/docs/en/options.md#provideplugin).\n\n## Version 1.9.4\n\n* Build won't be deleted in dev-mode.\n\n## Version 1.9.2\n\n* Fix bug with helper Icon in handlebars.\n\n## Version 1.9.1\n\n* Use gulp-pug-inheritance from fork because of errors in original.\n\n## Version 1.9.0\n\n* gulp-minify-html replaced with на gulp-htmlmin.\n* Add templater Pug support.\n* You can pass any data to templater by using env var TARS_ENV.\n* Bugfix.\n* English docs fixup and full update. Thanks to [icehaunter](https://github.com/icehaunter).\n* Dependencies update.\n\n## Version 1.8.3\n\n* Fix bug with svg2png in 2.0.0 Use 1.0.2\n\n## Version 1.8.2\n\n* Fix watcher for templates with _ in the begining of the name;\n* Default scheme for Jade component has been changed.\n* Dependencies update. Eslint has been updated to version 3.x.x.\n\n## Version 1.8.1\n\n* Init process without user-package.json fixed.\n* Autoprefixer was added for IE9.\n* Pathes for IE entry points were fixed.\n* Dependencies update.\n\n## Version 1.8.0\n\n* Modules directory was renamed to components. This is optional, you can change it in [tars-config](options.md#componentsfoldername).\n* Task concat-modules-data was renamed to concat-mocks-data.\n* Log fixing for case, when there is problems with sprite generation.\n* You can configure gulp-plugins by using [plugins-config.js](plugins-options.md).\n* Jade recompilation became faster.\n* You can crate components inside another components.\n* All images from assets of component will be moved to static/img/assets. Images are files with extensions svg, png, jpg, jpeg, jpe, gif, tiff and bmp.\nOther files will be moved to static/components-assets.\n* staticPrefix was removed from tars-config.\n* Option [generateStaticPath](options.md#generatestaticpath) was added.\n* Build name is based on local date.\n* TARS works in NodeJs 6.x.x version.\n\n## Version 1.7.1\n\n* Rebuild process of jade-templates became faster.\n* Gulp-csso update to version 2.0.0.\n\n## Version 1.7.0\n\n* Plugin gulp-strip-debug has been deleted. uglifyJS will strip all useless code.\n* Error log became much more clear.\n* You can use notifier.success and notifier.error not in pipe only.\n* Tars-config has been updated. All JavaScript-options in [one object now](options.md#js).\n* You can [import style-files from node_modules/bower_components by using short syntax](css-processing.md).\n* [Webpack](https://webpack.github.io/) has been added. You can use old workflow (concatenation of files) or webpack — this is optional feature, you can manage it [from tars-config](options.md#workflow-1). Alse [Hot Module Replacing](https://webpack.github.io/docs/hot-module-replacement.html) is available. This feature is [managed from tars-config too](options.md#usehmr).\n* Tasks main:dev an js:processing have been updated.\n* .babelrc update.\n* .eslintrc update. New version of eslint is used.\n```js\n// Updated/added rules:\nenv: {\n    commonjs: true\n},\n\nparserOptions: {\n    ecmaVersion: 6,\n    sourceType: 'module'\n},\n\nrules: {\n    'consistent-return': 0,\n    'keyword-spacing': 2,\n    strict: 0,\n    'no-confusing-arrow': 2,\n    'prefer-arrow-callback': 0,\n    'no-debugger': 0\n}\n\n// Deleted rules:\n'no-arrow-condition': undefined,\n'space-return-throw-case': undefined,\n'space-after-keywords': undefined,\n'no-empty-label': undefined,\n'no-process-exit': undefined\n```\n* Documentation update.\n* Dependencies update.\n\n## Version 1.6.3\n\n* Bug with images minification has been fixed.\n* Taks minify-raster-img has been renamed to minify-images. SVG-images will be minified in that task.\n* Docs fixup.\n\n## Version 1.6.2\n\n* Icon helper has been renamed from icon to Icon\n* is helper has been updated. != and !== operation has been added.\n\n## Version 1.6.1\n\n* Fix tasks for content images copy process.\n\n## Version 1.6.0\n\n* Sourcemaps are created only in dev-mode.\n* Skipped tasks are highlighted in log of gulp.\n* There is only one task for css pre- and postporcessing for all preprocessors.\n* Stylies for IE9 are compiled in separate task.\n* Watchers became much more smarter.\n* There is only one task to work with templaters.\n* **TARS supports only Node.js 4.x.x and higher**.\n* Option for stylies-inject during livereload is [in tars-config now](options.md#injectchanges).\n* jscs + jshint has been replaced with eslint.\n* **[You can pass data of one module to another by using functions](html-processing.md#working-with-modules-and-data-handlebars). So, it is really easy to init module with any data.**\n* Great refactoring.\n    - Add ES6, all tasks refactoring.\n    - Build process starts much more fast. All dependencies are required only at that moment then they are really needed.\n    - Some methods and helpers have been added:\n        + skipTaskLog method — add info about skipped tasks into gulp log;\n        + skipTaskWithEmptyPipe helper — it allows you to skip task, if no files were passed through that task;\n        + root property — you can get absolute path to tars folder from this property.\n        + isDevMode property — it returns !tars.flags.release && !tars.flags.min\n    - There are only links to tasks in gulpfile. All main tasks (like build, dev) have been moved from gulpfile to tasks/main and to watchers.\n    - Task browsersync has been removed. Browsersync starts in main:dev task.\n    - Tasks svg-action and compile-html-with-data-reloading have been moved to watchers.\n    - Task minify-html has been renamed to modify-html.\n    - Task pre-build has been renamed and moved into namespace main (main:pre-build).\n* [You can use css-files, that won't be compiled to one file](css-processing.md).\n* All js-code from static folder is in ignore section in babelrc by default. Babel has been updated to version 6.\n* Page template and head module update. All useless attributes has been removed. Template looks like page in [html5boilerplate](https://github.com/h5bp/html5-boilerplate).\n* You can use %=static=% or \\_\\_static\\_\\_ in CSS and HTML instead of %=staticPrefixForCss=% and %=staticPrefix=%. Old prefixes are supported, but it is strongly recommended to use new prefixes.\n* staticPrefixForCss property has been removed from tars-config and it is generated in tars/tars.js automatically.\n* Normalize has been updated to version 3.0.3\n* **[You can use custom Jade and Handlebars helpers](html-processing.md).**\n* Helper icon for Jade and Handlebars has been added to TARS. This helper generates template for svg-symbol including.\n* You can use [svg-symbols](svg-processing.md#svg-symbols). TARS supports three ways to include svg-symbols. Build for IE8 not supported in that workflow. And there is a polyfill in separate-js for svg-symbols correct loading for IE9 - Edge and all browsers, which don't support with flow.\n* useSVG property has been removed from tars-config. You have to configure SVG workflow by [new property in config](options.md#svg). In case of using old config (that has useSVG property), SVG config-object will be generated automatically.\n* [Data about all used pages will be add to full-data of your project](html-processing.md#html).\n* All sprite will have hash in their names then flag `--release` is used.\n* You can set port for Browsersync by using [env var](options.md#open).\n* [Default autoprefixer config has been updated](options.md#autoprefixerconfig).\n* Path to static folder generates automatically and depends on pages fs.\n* All useless tags, labels will be removed from build automatically. For example, if you don't build with `--ie` or `--ie8` flag, html5shiv won't be copied to ready build.\n* hml5shiv-print has been removed.\n* You can use plane JavaScript-object in data files.\n* [You can init your project without templater and preprocessor files mutation](https://github.com/tars/tars-cli/blob/master/docs/en/commands.md#tars-init). It would be useful for forks.\n* [You can automatically update your project with TARS-CLI](https://github.com/tars/tars-cli/blob/master/docs/en/commands.md#tars-update-project).\n* Task re-init is depricated now. This command will be removed from TARS in new version, cause there is great chance to broke your project.\n* Documentation update.\n\n## Version 1.5.0\n\n* Installation in NPM3 has been fixed. If you have a project, which has been made with TARS 1.4.1 and NPM2, and you want to develop this project in NPM3, you have to fix one line in tars/tars.js\n```javascript\nhandlebars: tars.require('gulp-compile-handlebars/node_modules/handlebars'),\n// replace with\nhandlebars: tars.require('handlebars'),\n```\n* Handlebars is used from its own package, not from gulp-handlebars.\n* You can use css-files in etc folder.\n\n## Version 1.4.1\n\n* Verbose logs on Error in css will be in output.\n* Docs about [Babel using](js-processing.md) were updated.\n* Html-prettify config was updated.\n* Notification will appear on Error even all notifications has been disabled.\n* Deps have been updated, bugs have been fixed.\n\n## Version 1.4.0\n\n* Css imports were added. Css (less, scss, sass, styl) files, began with _ will not be compiled, so it is recommended to import only these files. [More info](css-processing.md).\n* Added .sass extension supporting.\n* Tars-config.js has been updated. [Sourcemaps](options.md#sourcemaps) has more options. Added [Babel supporting switcher](options.md#usebabel).\n* Added ES6(ES.Next) syntax supporting with [Babel](options.md#usebabel). [More info](js-processing.md).\n* Autoprefixer was moved to the end in the postprocessors list.\n* Notifier got one interface for failed and successed end of task.\n* gulp-html-prettify has been added. Formatted HTML will be generated if [minifyHtml](options.md#minifyhtml) is switched to false.\n* You need to use flags `--ie9` or `--ie` to compile stylies for IE9. `--ie` will compile stylies for IE8 and IE9 too.\n* More helpers were added, docs were updated for helpers and all helpers were moved to task-folder.\n* Some bugs have been fixed.\n\n## Version 1.3.1\n\n* Config for PostCSS has been fixed. You do not need to require packages by yourself. You just write them to config and it just works. But don't forget to install all used postprocessors locally via NPM.\n\n## Version 1.3.0\n\n* Sourcemaps for js was added. You can see file name and path to this file from sources in browser .\n* [PostCSS](https://github.com/postcss/postcss) has been added. You can [add all postprocessors what you want](options.md#postcss).\n* Notification is disabled while build process. You will see it only in that  moment, when you will need it.\n* Added .hbs extension support for Handlebars templates.\n* Padding between images in raster-sprite has been added.\n* Main pages and modules have been refactored.\n* Browsersync will open default browser in OS, if there is no any [other instructions in tars-config](options.md#browser).\n* New entity tars has been added. This singleton has all methods and properties, which are useful for TARS.\n* [TARS-CLI has been created](https://github.com/tars/tars-cli).\n* Some bugs have been fixed.\n\n## Version 1.2.7\n\n* Bug with gulp-svg-spritesheet has been fixed.\n\n## Version 1.2.6\n\n* Bug with notify, when it is off has been fixed.\n\n## Version 1.2.4\n\n* Bug with init has been fixed.\n* Bug while png-sprite compiling has been fixed.\n\n## Version 1.2.3\n\n* Build process without notifier has been fixed.\n\n## Version 1.2.2\n\n* Assets' files watcher. Subdirectories are unsupported in modules/assets has been fixed.\n\n## Version 1.2.1\n\n* Code-style update. .jscsrc update.\n* Path was removed from dependencies list.\n* Docs in english were added.\n\n## Version 1.2.0\n\n* The new version of [Browsersync](https://www.browsersync.io/).\n* [baseDir](options.md#basedir) option for Browsersync was moved in tars-config.\n* Watchers use [chokidar](https://github.com/paulmillr/chokidar) module.\n* All watchers were moved in separate files in tars/watchers folder.\n* Watchers and tasks are included in gulpfile automatically.\n* 'builder-start-screen' task was moved into tars/tasks/services.\n* New helpers for handlebars were added (and [documentation for them](handlebars-helpers.md)). All helpers are stored in a separate file tars/helpers/handlebars-helpers.js\n* Framework folder was added on the path markup/static/js. This folder is for js-files used by the framework.\n* All dependences were updated.\n* Including modules syntax in Handlebars was changed. There is the old syntax:\n```handlebars\n{{> modules/head/head head.defaults}}\n```\n\nAnd there is the new one:\n```handlebars\n{{> head/head head.defaults}}\n```\n\n* There is no more a separate task to compile styles for IE9. Styles for IE9 are compiled as part of compiling styles task for all modern browsers. A separate file is created.\n* Workflow for preparing SVG was changed. Base64 encoding was changed with svg-sprite. Mixins for images including were not changed.\n* mData/mData.js –> data/data.js\n\n## Version 1.1.1\n\n* A bug of transfer js from separate-js was fixed. It was pointed out the old name of the folder.\n\n## Version 1.1.0\n\n* A user-package.json was added for user dependencies. There are changes in tars/helpers/install-additional-deps.js.\n* [Upgrade guide](update-guide.md) TARS was added.\n* [Gulp-sass](https://www.npmjs.com/package/gulp-sass) module was updated.\n* Generation version of the build was moved to a separate helper for easy customization. It is here: tars/helpers/set-build-version.js\n"
  },
  {
    "path": "docs/en/css-concat-processing.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/css-concat-processing.md\">Описание на русском</a>\n</p>\n\n# CSS concat processing\n\nConcatenation of styles will be in the following order:\n* Normalize\n* Styles for libraries\n* Mixins, sprites\n* Fonts\n* Vars\n* GUI\n* Common stylies (common.scss)\n* Styles for plugins (static/scss/plugins, including all subdirectories)\n* Components' styles (css is supported)\n* Styles of etc.{scss,css}\n\nAlso, you can use css files not including them into the bundle. There is a folder `separate-css` in `static/scss`, where you can store all files, which have to be included manually. There is an example of including in any template:\n\n```handlebars\n<link href=\"%=static=%css/separate-css/your-file.css\" rel=\"stylesheet\" type=\"text/css\">\n```\n\n**%=staticPrefix=% prefix works, but this prefix is deprecated! Use just `%=static=%`!**\n"
  },
  {
    "path": "docs/en/css-manual-processing.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/css-manual-processing.md\">Описание на русском</a>\n</p>\n\n# CSS manual processing\n\nThis workflow will be usefull, if you need to control css processing by yourself. You can use manual css processing in TARS from version 1.8.0\n\nMain entry points, style files which will contain imports for project style, are located at `static/scss/entry`. By default there will be one entry point created - `main.scss`. You can add more if you wil need it. These files will be compiled by a preprocessor. Your project files should be connected by adding them to entry point files via `@import` directive.\n\n`main.scss` entry point connection is already described in templates (`components/head`). In case you add new entry points, you need to connect them in templates by hand.\n\n`main.css` contents:\n\n```scss\n@import '../normalize.scss';\n\n/* Libraries, which is used in current project. */\n@import 'partials/_libraries.scss';\n\n/* Libraries, which is used in current project. */\n@import 'built-in-partials/_service.scss';\n\n/* Plugins, which is used in current project. */\n@import 'partials/_plugins.scss';\n\n/* Components, which is used in current project. */\n@import 'partials/_components.scss';\n\n/* Additional style files. */\n@import '../etc/etc.scss';\n```\n\nEntry point imports `normalize.scss`, then partial, where you can import libraries, then build-in partials (mixins for graphics, etc.), then partial with plugins, partial with components and lastly additional styles.\n\nPartial with components means that you will import your components' styles into that file specifically. But you don't need to use full relative path to compontnts' style from your partial. You can do like this:\n\n```scss\n@import 'components/_template/_template.scss';\n```\n\nIncluding styles for plugins and libraries from `node_modules` and `bower_components` is described  in [general style documentation](css-processing.md).\n\n**Warning:** Do not edit files in `build-in-partials` directory as they can be overwritten on project update.\n\nAlso there is an `ie` directory in entry points, which contains entry points for ie8 (files should have `_ie8` suffix) and ie9 (files should have `_ie9` suffix).\n\nTake note that only ie8 and ie9 specific styles should be included there, general styles will be added by default.\n\n"
  },
  {
    "path": "docs/en/css-processing.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/css-processing.md\">Описание на русском</a>\n</p>\n\n# CSS\n\nYou can use folowing CSS-preprocessors:\n* [Scss](http://sass-lang.com) .sass extension is supported;\n* [Less](http://www.lesscss.org);\n* [Stylus](http://learnboost.github.io/stylus)  \n\nYou can choose CSS-preprocessor in [tars-config.js](options.md#csspreprocessor).\n\nIn general, there are no surprises when using CSS-preprocessor. Use all the possibilities offered by the selected tool.\n\nIf you are used to the usual CSS, you can use CSS-syntax in any preprocessor.\n\nTARS supports two workflows for CSS-code processing:\n* [css concatenation](css-concat-processing.md);\n* [css manual processing](css-manual-processing.md).\n\nAll info below is general for both workflows.\n\nВсе, что описано ниже справедливо для обоих подходов.\n\nAll files with a `_` prefix won't be compiled by the builder. You should use these files for imports. Actually, you can import any files you want, but if you import a file without `_` you will have two copies in the compiled CSS file. This is the reason why files with `_` prefix won't be compiled. You can import all types of style files: `scss` (`sass`), `less`, `styl`, `css`.\nExample of import using `scss`:\n\n```scss\n// files are located in one directory\n@import '_partial.scss';\n\n// _partial.sass is located in neighbour directory `partials`\n@import '../partials/_partial.sass';\n```\n\nIf you need to include files from `node_modules` or `bower_components`, you don't have to write full path to `node_modules`, you can use short syntax, TARS will expand the path like this:\n\n```scss\n@import 'bootstrap/dist/bootstrap.scss';\n```\n\nIn case of that import TARS will try to find `bootstrap/dist/bootstrap.scss` in `node_modules` and `bower_components`. This feature is implemented in TARS from version 1.7.0\n\nIf you want to include the files from the static directory (pictures), you should use the placeholder %=static=%. Then including of the image as a background (in current example the picture will be taken from your main component) will be as follows (in this example scss is used):\n\n```scss\n.main {\n    background: url('%=static=%assets/main/bg.png') repeat;\n}\n```\n\n**%=staticPrefixForCss=% prefix works, but this prefix is deprecated! Use just `%=static=%`! This prefix works in TARS from version 1.6.0**\n\nThere are a couple of points on the organization  of `scss|sass|less|styl` files (e.g scss is selected):\n\n* Each component has its own css-representation.\n* Common styles for the project are recommended to put in common.scss in static/scss\n* Fonts are included in `fonts.scss`\n* Mixins are in `mixins.scss`\n* UI-elements styles are in `GUI.scss`\n* Variables are in `vars.scss`\n* Libraries styles are in `static/scss/libraries` (may contains subfolders and css-files).\n* Styles for plugins are in `static/scss/plugins` (may contains subfolders and css-files).\n* Styles which can't be put under categories listed above have to be put in `static/scss/etc/etc.{scss,css}`.\n* In the main folder with css (in this case, scss folder) you can not create new files (except when you correct task by yourself connected with working with css). New files can be created only in the `static/scss/plugins|libraries|etc|separate-css`.\n\nIf you'd like to use library from bower or npm package, you can import styles from package by using `@import`.\n\nFor IE8 and IE9 you can add fixes in a folder in the ie component folder. You need to create `ie8.{scss,sass,css}` or `ie9.{scss,sass,css}`.\n\n"
  },
  {
    "path": "docs/en/faq.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/faq.md\">Описание на русском</a>\n</p>\n\n# FAQ\n\nFor all questions I am waiting for you in the [gitter](https://gitter.im/tars/tars?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) or by email [tars.builder@gmail.com](mailto:tars.builder@gmail.com).\n\n1. **I have webpack and npm-scripts, so, I do not understand, how TARS with Gulp will be useful for me?**\n\nEvery task has its own instrument to resolve it. NPM-scripts are really good for many tasks and you can use only NPM-scripts. But Gulp is not only task-runner actually, it allows you easy transform file from FS to Stream. In case of using NPM-scripts, you have to develop parallel and async tasks processing.\nAnd some words about webpack: it was created to resolve imports/exports/requires in JavaScript. Nowadays it has quite many plugins, but its main task is to compile JavaScript.\nAnd in the end, Gulp + webpack = love, they can (and should) work together.\nYou can get more info from comments of [docs for webpack with Gulp usage](http://webpack.github.io/docs/usage-with-gulp.html).\n\n2. **Why Gulp, and not Grunt?**\nGulp is a stream builder of JavaScript projects. It uses streams and it is really fast. For example, I have a project where about a thousand stylus files, Grunt needs about 2.5 seconds for assembly and 2 seconds for processing by autoprefixer. Gulp makes all stuff for 0.5 seconds winning Grunt at least 4 times.\n\n3. **How to work with TARS?**\nThere are several variants.\n    * You have one big project with long period of develop/support. TARS will be extremely useful for you. Create components, pages. Store it somewhere in GIT, SVN.\n    * You have many projects with general components. So, in taht case you have several options:\n        - you can create you own library of components and include in to your own fork of TARS. So you will have all used components after init;\n        - you can use git. Every new project is a new branch from master. Inited TARS in master branch;\n        - and the last, you can store your own library of used components somewhere.\n    * You have many different projects. Just use CVS (GIT, SVN, etc.).\n\nYou can choose any option or create your own workflow.\n\n4. **We have our own builder on Gulp/Grunt, but we'd like to work with TARS and use features from our builder.**\nYou can transfer your tasks to user-tasks in TARS. If you would like to transfer grunt-tasks, you have to rewirte them to Gulp or use [gulp-grunt](https://www.npmjs.com/package/gulp-grunt). \nIf you need to Init TARS with all user-tasks by default you should create your own fork of TARS and init TARS with link to your fork. You can get more info from [docs for TARS-CLI](https://github.com/tars/tars-cli/blob/master/docs/en/commands.md#tars-init).\n\n5. **I have OS X (Ubuntu, Linux Mint …). Not all project's files are in the build.**\nYou have to increase the [ulimit](options.md#ulimit) in tars-config.js\n\n6. **I don't know anything about Gulp. Can I use this builder?**\nKnowledge of working with Gulp is not required. At the moment, builder covers most tasks of frontend. All you need to know is described in the documentation.\n\n7. **It seems to me that you are using is too complex file structure. Can I modify it for myself?**\nIf you know how to work with Gulp, after renaming/deleting/creating folders, you must edit appropriate tasks or [create user-tasks](tasks.md). Some directories are not mandatory and they can be safely removed.\nYou can also easily expand the file structure for js using the appropriate [options](options.md#jspathstoconcatbeforemodulesjs-%D0%B8-jspathstoconcataftermodulesjs) in the builder config file.\nFor the main folder with statics and folders whith images you can set the name in respective [options](options.md#fs) in the builder config file.\n\n8. **Everything seems to be installed, but nothing works. What to do? I have a Windows (7, 8, 10)**\nProbably not all dependences were installed. Run `npm i` command again. \nIf you still have errors, it would be nice if you will send them to ([tars.builder@gmail.com](mailto:tars.builder@gmail.com)) or to [gitter](https://gitter.im/tars/tars?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) chat.\n"
  },
  {
    "path": "docs/en/file-structure.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/file-structure.md\">Описание на русском</a>\n</p>\n\n# File structure\n\n**File structure is generated automatically. You do not need to create anything yourself.**\n\nBuilder has the following file structure:\n\n```\n├── gulpfile.js             # gulpfile of builder\n├── tars.json               # System file with info about builder\n├── tars-config.js          # Config file\n├── package.json            # Basic dependencies\n├── .babelrc                # Config for Babel\n├── .eslintrc               # Config for eslint\n├── user-package.json       # User dependencies\n└── tars/                   # Tasks and helpers for gulp\n    └── helpers/            # Helpers\n    └── tasks/              # System tasks\n    └── user-tasks/         # User's tasks\n    └── watchers/           # System watchers\n    └── user-watchers/      # User's watchers\n    └── tars.js             # Main file of the builder\n└── markup/                 # The main project folder\n    └── components/         # Components\n    └── pages/              # Page's templates\n    └── static/             # Static-files (css, js and so on)\n└── docs/                   # Documentation\n```\n\n\n## The structure of the individual component\n\nComponent is an independent unit of the page. Example component - \"header\" or \"footer\". Each page consists of components. Any component may include other components and can be included into each other.\n\n```\nexampleComponent/                           # Component example\n    └── assets/                             # Static files for current component (files with any extension) Subdirectories unsupport\n    └── ie/                                 # Styles for IE9.scss|sass|less|styl и IE8.scss|sass|less|styl)\n    └── data/                               # Folder for component's data\n        ├── data.js                         # Data for component (there is an example for data in _template component)\n    ├── exampleComponent.html               # Handlebars-represention of component (it could be jade)\n    ├── exampleComponent.scss|less|styl     # Css-representation of component (scss|sass|less|styl)\n    ├── exampleComponent.js                 # Js-represent\n    ├── anotherComponentFolder\n\n```\n\nAny component can be can be embedded into another component.\n\nAll images from asstes will be moved to static/img/assets/component_name or static/img/assets/component_name/embedded_component_name, if current component is embedded into another. Images are files with extensions svg, png, jpg, jpeg, jpe, gif, tiff and bmp. Other files will be moved to components-assets (the name of folder is depend on option fs.componentsFolderName).\n\nThe basic idea is to make the component as much isolated structure as possible. You can use the [BEM](https://ru.bem.info), [web components](http://webcomponents.org) (and their [realization from Google](https://www.polymer-project.org)), something else. You can do everything by old-fashioned way, all markup is in one component, but it is not recommended.  If we talk in BEM terms, each component is a block. There is an [excellent lecture](https://www.youtube.com/watch?v=pyAYbbDJjPo) on how to organize your code.\n\nPage templates are in `pages` folder. Pages are layouts and should contain as little code as possible. To create a new page just copy the existing one (or _template) and rename it or run [tars add-page](https://github.com/tars/tars-cli/blob/master/docs/en/commands.md#tars-add-page-pagename).\nAlso, you can add components via TARS-CLI — [tars add-component](https://github.com/tars/tars-cli/blob/master/docs/en/commands.md#tars-add-module-modulename).\n\n## Folder structure for static files\n\nWe assume that Scss was chosen as a css-preprocessor.\n\n```\nstatic/                                     # Folder for static-files. You can choose the name for that folder in tars-config.js\n    └── fonts/                              # Fonts (can contain subdirectories)\n    └── img/                                # Images. You can choose the name for that folder in tars-config.js\n        └── content/                        # Images for content (can contain subdirectories)\n        └── plugins/                        # Images for plugins (can contain subdirectories)\n        └── general/                        # General images for project (can contain subdirectories)\n        └── sprite/                         # Raster images, which is included in png-sprite.\n            └── 96dpi/                      # Images for displays with dpi 96\n            ...\n            └── 384dpi/                     # Images for displays with dpi 384 (more info in images-processing)\n        └── svg/                            # SVG-images\n    └── js/                                 # js\n        └── framework/                      # js-frameworks (backbone, for example)\n        └── libraries/                      # js-libraries (jquery, for-example)\n        └── plugins/                        # js-plugins\n        └── separate-js/                    # js-files, which must not be included in ready bundle\n    └── misc/                               # General files, which will be moved to root directory of ready project — favicons, robots.txt and so on  (can contain subdirectories)\n    └── scss  \n        ├── entry/                          # Styles for entry points for css in case of manual css-processing More info [here](css-manual-processing.md).                \n        └── etc/                            # Styles, which will be included at the end of the ready css-file (can contain subdirectories)\n        └── libraries/                      # Styles for libraries (can contain subdirectories)\n        └── plugins/                        # Styles for plugins (can contain subdirectories)\n        └── sprite-generator-templates/     # Templates for sprite generating\n        └── sprites-scss/                   # Mixins for sprites\n        ├── separate-css/                   # Css-files, which must not be included in ready bundle\n        ├── common.scss                     # General styles\n        ├── fonts.scss                      # Styles for fonts\n        ├── GUI.scss                        # Styles for GUI elements (inputs, buttons and so on)\n        ├── mixins.scss                     # Project's mixins\n        ├── normalize.scss                  # Styles reset\n        ├── vars.scss                       # Variables\n```\n\n\n## The structure of the complete build\n\nThere will be two folders in the root after assembly of the project: dev and builds. Below is the description of the dev version (with --ie8 mode enabled). The finished build is not much different from the dev version.\n\n```\ndev/\n    └── static/                         # Folder for static-files. You can choose the name for that folder in tars-config.js\n        └── css/                        # Ready styles and styles for IE9 and \n        IE8, if support is turned on and styles from separate-css.\n        └── components-assets/          # Static files for components.\n                └── exampleComponent/   \n        └── img/                        # Images for project\n            └── assets/                 # Static files for components. Only images\n                └── exampleComponent/      \n            └── content/                # Images for content\n            └── plugins/                # Images for plugins\n            └── svg-sprite/             # SVG-sprite\n            └── png-sprite/             # PNG-sprite for different dpi\n            └── rastered-svg-images/    # Raster svg-images for IE8\n            └── minified-svg/           # Minifies svg-images\n        └── js/                         # Ready main.js and separate js-files\n            └── separate-js/   \n    └── temp/                           # Temp folder for components' data\n    ├── Ready pages and misc-files\n```\n\nBuild version of the project does not contain a temp folder, includes minified css and js files. It contains optimized pictures and an archive with the assembled project (optional).\n\nIf the option useBuildVersioning is enabled, each build will be in a separate folder on the path that is specified in the option [buildPath](options.md#buildpath), called build_ver%build_date%. If useBuildVersioning disabled, the finished project will be generated on the path that is specified in the option buildPath, in folder 'build'.\n\nWhen you need to include an image you have to use the path in which they exist in the build.\n\nImmediately after initialization or reinitialization, `.tmpPreproc` and `.tmpTemplater` folders can appear in the root folder, which contain a downloaded template and css-preprocessor. After the first build these folders will be deleted. So just ignore them. These folders are included in .gitignore, so they won't be in your repository.\n\nThis file structure can be changed with the appropriate corrections of tasks and watchers. For some folders you do not need to dig through tasks and watchers: for example, it is possible to create a folder for storing js, [which must be included before and after the components](options.md#jspathstoconcatbeforemodulesjs-и-jspathstoconcataftermodulesjs). This will be useful in case of using different js-frameworks.\n\nAlso, it is not necessary to use all the folders for images or JavaScript. If something is not necessary, it can be removed.\n"
  },
  {
    "path": "docs/en/fonts-and-misc.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/fonts-and-misc.md\">Описание на русском</a>\n</p>\n\n# Working with fonts and misc-files\n\nAll fonts are in the fonts folder with statics for the project.\n\nIn misc folder you can store any additional files, such as favicon and so on. All files will be copied from here into the root of the compiled project. Supports nested directories. When you copy files folder hierarchy will be saved.\n"
  },
  {
    "path": "docs/en/handlebars-helpers.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/handlebars-helpers.md\">Описание на русском</a>\n</p>\n\n# Handlebars-helpers\n\nThere are some useful built-in helpers. You can add your own helpers to `/tars/user-tasks/html/helpers/handlebars-helpers`. It is not necessary to register your helpers. You just have to add them to exported object `handlebarsHelpers` as a function. All custom helpers will be available in tempalates automatically. Besides, all custom helpers will be moved automatically after project update via TARS-CLI.\n\nLet's describe built-in helpers.\n\n## repeat\n\nIt is used to create a simple loop from 0 to n.\n\nSyntax:\n\n```handlebars\n{{#repeat n}}\n    Do something\n{{/repeat}}\n```\n\nn — is a number of repetitions. Number, integer.\n\n\n## is\n\nIt is used to expand the standard `if`. Standart `if` is able to check only if a value exists or not. `is` allows you to use the default behavior of if from JavaScript. The comparison operation is passed as a string as the second argument. The comparison values are passed as a string (or as a value from data) as the first and the third arguments. Following operations are available (all operations are performed in JavaScript, respectively, and the comparison result is obtained in the same way as if it were inside JavaScript):\n\n* `==` not strict equality;\n* `===` strict equality;\n* `>` strict greater;\n* `>=` greater or equal;\n* `<` strict less;\n* `<=` less or equal;\n* `!=` not strict inequality;\n* `!==` strict inequality.\n\n`test` is the variable passed to the template.\n\n```js\ntestComponent: {\n    test: 10\n}\n```\n\nSyntax:\n\n```handlebars\n{{#is test '>' 9}}\n    true\n{{else}}\n    false\n{{/is}}\n```\n\n\n## strip\n\nIt cuts all spaces from the passed content.\n\nSyntax:\n\n```handlebars\n<style>\n    ul li {\n        display: inline-block;\n    }\n</style>\n\n{{#strip}}\n    <ul>\n        <li>qwe</li>\n        <li>asd</li>\n    </ul>\n{{/strip}}\n```\n\nResult:\n\n```html\n<ul><li>qwe</li><li>asd</li></ul>\n```\n\n\n## toLowerCase\n\nTransform passed string to lowercase.\n\nSyntax:\n\n```handlebars\n{{toLowerCase 'string'}}\n```\n\n\n## toUpperCase\n\nTransform passed string to uppercase.\n\nSyntax:\n\n```handlebars\n{{toUpperCase 'string'}}\n```\n\n\n## capitalizeFirst\n\nTransform of the first character of passed string to uppercase.\n\nSyntax:\n\n```handlebars\n{{capitalizeFirst 'string'}}\n```\n\n## formatDate, now, i18n\n\nAdditional helpers. Docs are [here](https://github.com/assemble/handlebars-helpers)\n"
  },
  {
    "path": "docs/en/html-processing.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/html-processing.md\">Описание на русском</a>\n</p>\n\n# HTML\n\n[Jade](http://jade-lang.com), [Pug](https://pugjs.org/api/getting-started.html) or [Handlebars](http://handlebarsjs.com) can be used as a html templater. You can choose templater in [tars-config.js](options.md#templater) or [during initialization of TARS via TARS-CLI](https://github.com/tars/tars-cli/blob/master/docs/en/commands.md#tars-init).\n\nYou can use all features of Jade, Pug and Handlebars. If you are used to the regular HTML, choose the handlebars and write HTML as before.\n\nIf you don't want to compile a particular page, you can simply add the '_' at the begining of the page name and it will not be compiled.\n\nIf you need to include files from the static directory (images, js-files), you must use the placeholder [`%=static=%` or `__static__`](options.md#staticprefix). Then including of an image will be as in following example (in this example Handlebars is used):\n\n```html\n<img src=\"%=static=%img/content/example.jpg\"/>\n```\n\nTo include image in CSS you need to use the same placeholder – `%=static=%`. This placeholder will be replaced with string from [staticprefixforcss](options.md#staticprefixforcss) from config.\n\n**%=staticPrefixForCss=% and %=staticPrefix=% prefixes work, but these prefixes are deprecated! Just use %=static=%! New prefixes work in TARS from version 1.6.0**\n\nVery important feature is the usage of different data types in one template. For example, we have a head component, which has all that you should put in the head tag (different meta, titles, etc.). Suppose that every page should have its own title. Making copies of the same component, which differ only in one line is not the best practice. It would be logical to separate data from presentation.\n\nSo, the folder with the component has a folder called `data`, which has js file with data for this component.\nExample of data can be found in the component _template:\n\n```js\ncomponentName: {\n    dataType: {\n        property: value\n    }\n}\n```\n\nIn case of syntax errors in data files from your editor you can use another syntax, just a simple JavaScript object:\n\n```javascript\ndata = {\n    componentName: {\n        dataType: {\n            property: value\n        }\n    }\n};\n```\n\nTARS supports both syntaxes by default.\n\nIn the file `data.js` comments are supported within the data object.\n\nYou can add component into another component folder from TARS 1.8.0. In that case there can be some problems with duplicating names of these components. To prevent this situation, TARS generates unique key for each embedded component using the next scheme:\n\n```javascript\n'parentComponentName_anotherParentComponent_currentComponentName' = {\n    dataType: {\n        property: value\n    }\n};\n```\n\nIn the embedded component data file you can write code as usual:\n\n```javascript\nconst data = {\n    'currentComponentName': {\n        dataType: {\n            property: value\n        }\n    }\n};\n```\n\nUnique key will be generated automatically.\n\nBy default full data will contain the data from `_template` component and a list of all project pages like this:\n\n```javascript\n__pages: [\n    {\n        name: 'pageName',\n        href: 'pageHref'\n    }\n]\n```\n\nYou can use this array to render a list of links to all pages of a project.\n\nYou can pass any data to templater by using env var TARS_ENV. For example, you can pass a simple string:\n\n```bash\nTARS_ENV=\"Hello World\" tars dev --silent\n```\n\nAnd then you can get it in template (handlebars):\n\n```handlebars\n{{TARS_ENV}}\n```\n\nYou can pass object to TARS_ENV too:\n\n```bash\nTARS_ENV=\"{\\\"name\\\": \\\"Paul\\\"}\" tars dev --silent\n```\n\nAnd then you can get it in template (handlebars):\n\n```handlebars\n{{TARS_ENV.name}}\n```\n\n**It is important to add double quotes and escape quotes inside object!**\n\nConnecting components with different data looks differently in Jade/Pug and Handlebars.\n\n## Working with components and data in Handlebars\n\nIncluding component on the page:\n\n```handlebars\n{{> componentFolderName/componentName}}\n```\n\nIncluding component with passing data to the template:\n\n```handlebars\n{{> componentFolderName/componentName componentName.dataType}}\n```\n\nExample of including head component with default data:\n\n```handlebars\n{{> head/head head.defaults}}\n```\n\nInside the component data is displayed by the handlebars:\n\n```handlebars\n<title>{{title}}</title>\n```\n\nIf you include component without passing data, component gets an access to the global scope. For example, if we include component `head` without data, we will have to use the following code to get access to the field `title`:\n\n```javascript\n// head/data/data.js\nhead: {\n    defaults: {\n        title: 'Default title'\n    }\n}\n```\n\nindex.html\n```handlebars\n{{> head/head}}\n```\n\nhead.html\n```handlebars\n<title>{{head.defaults.title}}</title>\n```\n\nBut, if you have passed the data to component, you will not have access to the data of a child component. You have to pass global scope to the parent component (to not pass any data while including), to pass data for a child component. Or you can use another variant:\n\nindex.html\n```handlebars\n{{> component1/component1 component1.main}}\n```\n\ncomponent1.html\n```handlebars\n\n<h1>{{title}}</h1>\n\n{{> component2/component2 component2.main}}\n```\n\n```javascript\n// component1/data/data.js\ncomponent1: {\n    main: {\n        title: 'Title of component1',\n        component2: function (fullData) {\n            return fullData.component2;\n        }\n    }\n}\n```\n\ncomponent2.html\n```handlebars\n\n<h2>{{title}}</h2>\n```\n\n```javascript\n// component2/data/data.js\ncomponent2: {\n    main: {\n        title: 'Title of component2'\n    }\n}\n```\n\nSo, you can get access to data of any component from data-file of current-component by using really simple construct:\n\n```javascript\n// component/data/data.js\ncomponent: {\n    main: {\n        title: 'Title of component',\n        innerComponentData: function (fullData) {\n            // fullData is an object \n            // with all data of the application\n            return fullData.componentName.componentType;\n        }\n    }\n}\n```\n\nEverything will be much more easier with arrow functions ES6:\n\n```javascript\n// component/data/data.js\ncomponent: {\n    main: {\n        title: 'Title of component',\n        innerComponentData: fullData => fullData.componentName.componentType\n        }\n    }\n}\n```\n\nDo not forget, that embeded components will have unique key in the complete data file in the build.\n\nHandlebars is known as a very simple templater. But it is uncomfortable to use Handlebars in creation process without frameworks or something like that. So, different helpers have been added that expand Handlebars.\n\nHelpers description can be found [here](handlebars-helpers.md).\n\n\n## Working with components and data in Jade/Pug\n\nWhen using Jade/Pug, each component is a mixin, which is included in a page file. Mixin can receive data.\n\nIncluding component on the page:\n\n```jade\ninclude ../components/componentFolderName/componentName\n+componentName()  // Component include\n```\n\nIncluding component with data transmission in the template:\n\n```jade\ninclude ../components/componentFolderName/componentName\n+componentName(componentName.dataType)  // Component include\n```\n\nExample of head component including with default data:\n\n```jade\ninclude ../components/head/head\n+head(head.defaults)\n```\n\nYou have to add extension in Pug:\n\n```jade\ninclude ../components/head/head.pug\n+head(head.defaults)\n```\n\nInside the component data is displayed by Jade/Pug (for example, the head component):\n\n```jade\nmixin head(data)\n   <title>#{data.title}</title>\n```\n\nYou can use any features that are available in Jade/Pug. You can include components with any nesting of child components and with any data by using inlude and '+'. And you can use functions in data.js like in examples for Handlebars.\n\nThere is one built-in helper for Jade/Pug in TARS — Icon. This helper generates templates for svg symbol inclusion. You can add your own helpers to `/tars/user-tasks/html/helpers/jade\"pug-helpers`. There is an example of user-helper in there. You can use added helpers in a template like:\n\nFor Jade:\n```jade\n= jadeHelpers.helperName(params)\n\n<!-- If your helper returns unescaped code -->\n!= jadeHelpers.helperName(params)\n```\n\nFor Pug:\n```jade\n= pugHelpers.helperName(params)\n\n<!-- If your helper returns unescaped code -->\n!= pugHelpers.helperName(params)\n```\n"
  },
  {
    "path": "docs/en/images-processing.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/images-processing.md\">Описание на русском</a>\n</p>\n\n# Images\n\nAll work with images in TARS can be divided into two parts: \"Sprites\" and \"Separate images\".\n\n## Sprites\n\nTARS supports two formats for a sprite image: PNG and SVG.\n\n**TARS supports two workflows of working with SVG. You can get more info from [docs about working with SVG](./svg-processing.md)**\n\nThe general approach is described in the [presentation](http://www.slideshare.net/codefest/codefest-2014-2) of web developer [Timofey Chaptykov](https://github.com/Chaptykov).  Approach is briefly described below. The advantage of this approach is explained in the presentation and will not be explained here.\n\nAdvantages of concatinating interface (and other small or often repeated images) into a single sprite will not be described here. If you don't know what a sprite is, you can look up the details [here](https://en.wikipedia.org/wiki/Sprite_(computer_graphics)).\n\nYou may skip the theory and go to the [description of the work with sprites](#sprites-inclusion).\n\nNowadays there are a lot of displays with different pixel density. So, what does it mean? Let's compare iPhone 3GS and iPhone 4. 3GS has 320x480 display resolution and iPhone 4 has 640x960. How can you see, resolution has doubled, but diagonal is the same. It means, that pixel became smaller. So, there is a parameter device-pixel-ratio (or dppx) which means, how many real pixels there are in one logical pixel. For iPhone 4 dppx is 2.\n\nMore details can be found [here](http://stackoverflow.com/questions/21971331/what-is-dots-per-css-inch-and-dots-per-physical-inch) and [here](http://www.w3.org/TR/css3-values/#absolute-lengths).\n\nSuppose we have a sprite of PNG images. These pictures have a fixed size. If we will stretch this image on the number of pixels 3 times the size of the image, the image will be blurry.\n\nTo get rid of this problem, you can use an image 3 times larger for such display, and the size of the image in CSS must be set basing on the size of the original image (the property background-size).\n\nAt the moment there are screens with dppx from 1 to 4 (and soon will be higher). To prepare sprites for the 4 screen sizes is a lot of work.\n\nSVG helps. SVG is vector, it does not depend on dppx of the screen, it is rendered perfectly in modern (and not so) browsers. You can make only 1 size and this image will look the same on all screens.\n\nUnfortunately SVG has several disadvantages:\n\n* SVG badly displays radial and other complex gradients (linear is displayed excellently).\n* Complex shadows are badly displayed.\n* Is not displayed in IE8.\n\nSo we have to combine two approaches: SVG everywhere we can use it. For the rest -  prepare PNG images for those screens that you are going to support. For IE8 we will simply rasterize SVG images.\n\n**TARS supports two workflows of working with SVG. You can get more info from [docs about working with SVG](svg-processing.md)**\n\n## Sprites inclusion\n\nImages that can not be rendered in SVG are copied to 'static/img/sprite/96dpi|192dpi|288dpi|384dpi'. 96dpi folder is for images for screens with dppx = 1, 192dpi folder is for images twice as large as the original, with the names of the originals. These images will be displayed on the screens with dppx = 2. And it's similar for other dppx.\n\nUsed screens are configured [in the tars-config](options.md#useimagesfordisplaywithdpi).\n\nIncluding icon from raster sprite to CSS code is achieved by a mixins (example on SCSS, mixins name and other input parameters for different CSS-preprocessors are the same):\n\n```scss\n@include bg($png-image-name);         // Sprite with png-images inclusion\n```\n\nAttention, $png-image-name is a **variable**, that has the same name as the icon, which you'd like to use (without extension).\n\n`bg` mixin will include background into the CSS, picture size, background-size and sets positioning inside png sprite. It is not necessary to add nothing more, mixin will set media expression for screens with different dppx.\n\n## Separate images\n\nWorking with separate images is very simple. Separate images are divided into several categories. Depending on the category images are placed in different locations.\n\nBuilder supports images of any type, but only SVG, PNG, JPG will be exposed to minification. _Anything described below is just a recommendation, you can structure image storage however you like._\n\n### Images for component\n\nThey are located in the assets folder inside the component. To include image using the following template (to connect images to HTML you must use the placeholder [`%=static=% `](options.md#staticprefixforcss)):\n\n```css\n.componentName {\n    background: url('%=static=%assets/componentName/sample-image-name.png') no-repeat;\n}\n```\n\nIf you would like to insert images in HTML, you have to use the placeholder [`%=static=%`](options.md#staticprefix):\n\n```handlebars\n<div class=\"news__item\">\n    <img src=\"%=static=%img/assets/componentName/sample-image-name.png\" alt=\"\">\n</div>\n```\n\n\n**%=staticPrefixForCss=% and %=staticPrefix=% prefix works, but these prefixes are deprecated! Use just `%=static=%`! New prefix works in TARS from version 1.6.0**\n\nNested directories are supported.\n\n### Images for content\n\nThey are in the folder (by default): `static/img/content/`. You should put images that you will use in the content area on the site into this folder, for example, on the news page. Nested directories are supported.\n\nIncluding images inside HTML:\n\n```handlebars\n<div class=\"news__item\">\n    <img src=\"%=static=%img/content/sample-image-name.jpg\" alt=\"\">\n</div>\n```\n\n**%=staticPrefix=% prefix works, but this prefix is depricated! Use just `%=static=%`!**\n\n### Images for plugins\n\nThey are in the folder (by default): `static/img/plugins/`. In this folder you should put images that are used in different plugins. Nested directories are supported.\n\n### General images\n\nThey are in the folder (by default): `static/img/general/`. In this folder you should put images that are used for the whole project, such as the general background of the site. Nested directories are supported.\n"
  },
  {
    "path": "docs/en/js-concat-processing.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/js-concat-processing.md\">Описание на русском</a>\n</p>\n\n# JS-processing with simple concatenation\n\nYou should use this workflow in case if you don't have large project or you don't need to resolve dependencies between files. All JavaScript files will be concatenated into one file in a specific order.\n\nBy default JavaScript files are located in 2 places:\n\n* in the static folder, in a subfolder named `js`;\n* in each separate component.\n\nYou can add your own folders for JavaScript, using the appropriate [option](options.md#jspathstoconcatbeforemodulesjs-and-jspathstoconcataftermodulesjs) in the TARS config file.\nAll JavaScript-code is collected in a separate file, except for JavaScript files, which are located in a `separate-js` directory. These files are copied as-is in the build. Example of such file is `html5shiv.js`.\n\nFiles are collected in the following order:\n\n* `static/js/framework` (including subfolders)\n* `static/js/libraries` (including subfolders)\n* `static/js/plugins` (including subfolders)\n* all files, which have paths in the `jsPathsToConcatBeforeModulesJs` option\n* JavaScript-files from components\n* all files, which have paths in the `jsPathsToConcatAfterModulesJs` option\n\n**All files with `_` in the begining of the file name won't be added to bundle and won't be linted by eslint.**\n\nChecking files from `jsPathsToConcatBeforeModulesJs` and `jsPathsToConcatAfterModulesJs` can be controlled separately by [appropriate options](options.md#jspathstoconcatbeforemodulesjs-and-jspathstoconcataftermodulesjs).\n"
  },
  {
    "path": "docs/en/js-processing.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/js-processing.md\">Описание на русском</a>\n</p>\n\n# JS-processing\n\nTARS supports two workflows for JavaScript-code processing:\n* [concatenation of all JavaScript-files into one bundle in a specific order](js-concat-processing.md);\n* [resolving dependencies between JavaScript-files (from TARS 1.7.0)](js-webpack-processing.md).\n\nBoth workflows support style and error checking with eslint. Config files for eslint are in the root folder: `.eslintrc` and `.eslintignore`. You can switch off eslint by using [`js.lint` config option in `tars-config.js`](options.md#lint)\n\nES6 (ES.Next) syntax is supported by using [Babel](https://babeljs.io/). Use option [`useBabel`](options.md#usebabel) to turn on the ES6 (ES.Next) syntax (it is turned off by default). If you want to exclude some files from Babel processing you can add `babel_ignore_` to the begining of file name or add the file (or directory) to ignore in `.babelrc` in the project root. All JavaScript files from folders `static/framework`, `static/libraries`, `static/plugins` and `static/separate-js` are ignored in `.babelrs` by default. All config for Babel is in the project root. See [all babel options](https://babeljs.io/docs/usage/options/), except for sourcemap and filename which is handled for you.\n\nYou can manage sourcemaps from [options](options.md#sourcemaps).\n\n"
  },
  {
    "path": "docs/en/js-webpack-processing.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/js-webpack-processing.md\">Описание на русском</a>\n</p>\n\n# JS-processing with webpack\n\n**Please, direct all questions about \"how webpack works\"/\"how to configure webpack\" to Google, Stack Overflow and so on!**\n\nIf you do not know anything about webpack, please, read [documentation of webpack](http://webpack.github.io/docs/) at first.\n\nWebpack is already configured in TARS for comfortable work. But you can change `webpack.config.js` in the project root as you need.\n\nBy default, there is only one entry point: `markup/static/js/main.js`. You can choose another entry point or points. **You have to use function `prepareEntryPoints` to prepare config object with entry points. It is necessary for Hot Module Replacement!**\n\nBy default webpack can resolve dependencies, which is required by `require` (`import/export`, if babel is used). You can require JavaScript file of any component in any JavaScript file of your project by using alias `components`. Let's assume, that we are in `markup/static/js/main.js` and we'd like to require JavaScript file from component `example`. You can set relative path, but it is to difficult to calculate the correct path. So we can use alias `components`:\n\n```js\nimport foo from 'components/example/example'; // useBabel: true\n// or\nconst foo = require('components/example/example');\n\n// Old type will work too\nconst foo = require('modules/example/example');\n```\n\nAlso, there is alias for static folder:\n\n```js\nimport $ from 'static/js/jquery/jquery'; // useBabel: true\n// or\nconst $ = require('static/js/jquery/jquery');\n```\n\nIf you need to require module from `node_modules`, you should specify package name only:\n\n```js\nimport $ from 'jquery';  // useBabel: true\n// or\nconst $ = require('jquery');\n```\n\nSourcemaps are already configured and you can [manage them from tars-config](options.md#sourcemaps). Sourcemaps from vendor modules will be added to main sourcemaps by source-map-loader. uglifyJS is used to compress production-ready code.\n\nYou can use value of `NODE_ENV` in your code. [webpack.DefinePlugin](http://webpack.github.io/docs/list-of-plugins.html#defineplugin) is used.\n\nWebpack built-in watcher is used for changes in your code.\n\nAlso, you can use [Hot module replacement](https://webpack.github.io/docs/hot-module-replacement.html). This feature is implemented with middleware for Browser-sync and plugin [webpack.HotModuleReplacementPlugin](http://webpack.github.io/docs/list-of-plugins.html#hotmodulereplacementplugin).\n\nBy defult you can use babel to transpile your ESNext code into ES5. Babel-loader is used. Also, you can lint your code by eslint. Eslint-loader is used for this feature. Eslint uses built-in JavaScript code parser, but if you need to lint ESNext code, you have to use another parser: babel-eslint. So, you have to install it localy and set it in .eslintrc. You can get more info from [babel-eslint repository](https://github.com/babel/babel-eslint) and [documentation for eslint](http://eslint.org/docs/user-guide/configuring#specifying-parser-options).\n"
  },
  {
    "path": "docs/en/options.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/options.md\">Описание на русском</a>\n</p>\n\n# Options\n\nAll builder configuration is in one file — `tars-config.js` at the root of the project.\n\nYou need to restart the build to apply changes.\n\n## Variable options\n\n### postcss\n\nType: `Array`\n\nDefault: `[]`\n\nExample: \n````javascript\npostcss: [\n        {\n            name: 'postcss-short',\n            options: {\n                deny: ['text']\n            }\n        }, {\n            name: 'postcss-size',\n            options: {}\n        }\n    ]\n````\n\nYou can set all used postprocessors. Do not forget to install them.\n\n### svg\n\nType: `Object`\n\nConfig for working with SVG in TARS.\n\n#### active\n\nType: `Boolean`\n\nDefault: `true`\n\nActivate svg-processing.\n\n#### workflow\n\nType: `String`\n\nDefault: `sprite`\n\nAvailable workflows of working with SVG in TARS. You can use SVG-sprite `sprite` and SVG-symbols `symbols`.\n\n**Build for IE8 won't be created then \"symbols\" is used**\n\n#### symbolsConfig\n\nType: `Object`\n\nConfig for working with SVG then \"symbols\" workflow is selected.\n\n##### loadingType\n\nType: `String`\n\nDefault: `inject`\n\nThis option sets type of svg-symbols loading workflow.\n\nYou can set:\n* inject into the page code — `inject`;\n* just separate file — `separate-file`;\n* separate file with link for each use to that file — `separate-file-with-link`.\n\n##### usePolyfillForExternalSymbols\n\nType: `Boolean`\n\nDefault: `true`\n\nSVG-symbols loading from separate file is supported in all modern browsers natively except IE9 - Edge. You have to use polyfill for them. If you do not support IE, you can set false to this option.\n\n##### pathToExternalSymbolsFile\n\nType: `String`\n\nDefault: `''`\n\nYou can set a path to file with svg-symbols. File will be created in that directory, which was set in option. It will be created in the root of your build by default.\n\nPossible value: `static/images/`.\n\n### css\n\nType: `Object`\n\nConfig for CSS processing in TARS.\n\n#### workflow\n\nType: `String`\n\nDefault: `concat`\n\nType of CSS-code processing.\n\nYou can set:\n* `concat` — concatenation of all CSS-files into one bundle in a specific order;\n* `manual` — you have to import all used files into entry points by yourself.\n\n### js\n\nType: `Object`\n\nConfig for JavaScript processing in TARS.\n\n#### workflow\n\nType: `String`\n\nDefault: `concat`\n\nType of JavaScript-code processing.\n\nYou can set:\n* `concat` — concatenation of all JavaScript files into one bundle in specific order;\n* `modular` — using bundler, which will resolve all dependencies between JavaScript-files.\n\n#### bundler\n\nType: `String`\n\nDefault: `webpack`\n\nYou can specify bundler, if `modular` workflow is selected. Right now you can only choose webpack.\n\n#### lint\n\nType: `Boolean`\n\nDefault: `true`\n\nError checking in JavaScript code and code style (config for eslint is in the project root, in `.eslintrc`. See [eslint options](http://eslint.org/)). Also, you can manually switch off linting of files and folders by using `.eslintignore` in the root of your project.\n\n#### useBabel\n\nType: `Boolean`\n\nDefault: `false`\n\nThis option allow to use [Babel](https://babeljs.io/) for ES6(ES7) syntax support. Config for Babel is in project root, in `.babelrc`. See [babel options](https://babeljs.io/docs/usage/options/), except for `sourcemaps` and `filename` which are handled for you by default.\n\n#### webpack\n\nType: `Object`\n\nYou can switch on/off additional cool features for webpack.\n\n##### useHMR\n\nType: `Boolean`\n\nDefault: `false`\n\nSwitch on/off [Hot module replacement](https://webpack.github.io/docs/hot-module-replacement.html).\n\n##### providePlugin\n\nType: `Object`\n\nDefault: `{}`\n\n[Provide Plugin](https://webpack.github.io/docs/list-of-plugins.html#provideplugin) options. Automatically loaded modules.\n\n#### removeConsoleLog\n\nType: `Boolean`\n\nDefault: `true`\n\nRemoving console.log and alerts from js files in the build. It's an option, because sometimes it is necessary to retain console.log in the complete build.\n\n#### jsPathsToConcatBeforeModulesJs and jsPathsToConcatAfterModulesJs\n\nType: `Array of Strings`\n\nDefault: `[]`\n\nThis option makes sense only in case of using concat workflow. In that case all JavaScript code of the project is concatenated into one file except for JavaScript files located in the `separate-js` directory. If you want to include files from other locations into the build (for example, you created a separate directory for JavaScript files), you can register it in these options by adding a path or an array of paths (patterns paths, such as `controllers/**/*.js`) to JavaScript files. Files, which should be added to the build before main modules should be added in `jsPathsToConcatBeforeModulesJs` and after main modules in `jsPathsToConcatAfterModulesJs`\n\nIt will be useful for building a website on a JavaScript framework, which adds its own entities (such as controller, router, etc.). You do not need to go into tasks, just create a separate directory and specify for which files you want to watch.\n\nAlso you can disable eslint for these files (lintJsCodeBeforeModules and lintJsCodeAfterModules options).\n\n### sourcemaps\n\nType: `Object`\n\nDefault: \n```javascript\nsourcemaps: {\n    js: {\n        active: true,\n        inline: true\n    },\n    css: {\n        active: true,\n        inline: true\n    }\n},\n```\n\nConfig for sourcemaps. Sourcemaps for JavaScript and CSS work only in dev mode.\nactive {Boolean}: to use sourcemap or not.\ninline {Boolean}: to use sourcemap inlined into source-file or to use a separate file.\n\n### notifyConfig\n\nConfig for notifications module.\n\nWhen project files are changed there will be given a system notifications, which will indicate which file is changed and what task is executed.\n\n#### useNotify\n\nType: `Boolean`\n\nDefault: `true`\n\nEnabling of notification. You can disable notifications by using environment variables:\n```bash\nexport DISABLE_NOTIFIER=true;\n# or\nexport NODE_ENV=production;\n```\nEnvironment variables will overwrite useNotify value from tars-config.js\n\n#### title\n\nType: `String`\n\nDefault: `'TARS notification'`\n\nEach notification has a title. If you want to see another title, you should change this option.\n\n#### sounds\n\nSounds during the notifications.\n\n##### onSuccess\n\nType: `String, undefined`\n\nDefault: `undefined`\n\nIn this option the name of the system sound is passed which will be played during the notification in case of a successful build. If you don't need the sounds, you can set it with `undefined` value.\n\n##### onError\n\nType: `String, undefined`\n\nDefault: `undefined`\n\nIn this option the name of the system sound is passed which will be played during the notification in case of a failed build. If you don't need the sounds, you can set it with `undefined` value.\n\n### minifyHtml\n\nType: `Boolean`\n\nDefault: `false`\n\nEnabling minifications for HTML. If is set to `false`, compiled html will be prettified.\n\n### generateStaticPath\n\nType: `Boolean`\n\nDefault: `true`\n\nThis option turns on autogeneration of a relative path to the static directory from the current page. In case of using a server or livereload, path to static won't be generated, because static files are served by the server.\n\n### devPath\n\nType: `String`\n\nDefault: `'./dev/'`\n\nYou can set a string with a relative or an absolute path to the folder where the project should be built in development mode.\nUsing `/` after the path name is required so that there are no problems accessing the files.\n\n### buildPath\n\nType: `String`\n\nDefault: `'./builds/'`\n\nYou can set a string with a relative or an absolute path to the folder where the project should be built.\nIf you are using useBuildVersioning (use versioning of builds), each new build will be created in a separate folder with a name - the build version, and each folder will be created at the path specified in `buildPath`.\nUsing `/` after the path name is required so that there are no problems accessing the files.\n\n### useBuildVersioning\n\nType: `Boolean`\n\nDefault: `true`\n\nUse build versioning. The name of the version consists of the build name + date of creation (accurate to a second).\n\n### useArchiver\n\nType: `Boolean`\n\nDefault: `true`\n\nCreating the archive of the build. The archive is created in the folder with the build. If project name is set in `package.json`, it will be used as the archive name, otherwise it will be `build` by default. The date of build creation will be also added to the name of the archive.\n\n### ulimit\n\nType: `Number`\n\nDefault: `4096`\n\nBy default, the number of simultaneously open files in the operating system (unix based) is limited. Since the TARS is working on Gulp, the number of simultaneously open files may be large. To avoid problems with that, you can set [ulimit](http://ss64.com/bash/ulimit.html). If the project uses the large number of files and some of them do not get into the final build, then you can just increase this option.\n\n## Partially modifiable options\n\nThese options can be changed before the command `init` only, because they don't influence any other command, besides `useImagesForDisplayWithDpi`. More info below.\n\n### templater\n\nType: `String`\n\nDefault: `handlebars`\n\nOptions: `jade`, `pug`, `handlebars`\n\nUsed templater is specified in this option. `Jade`, `pug` and `handlebars` are available for now. The name of the templater is set in the option with a small letter.\n\nIf you want to write in plain HTML, retain the option unchanged.\n\n### cssPreprocessor\n\nType: `String`\n\nDefault: `scss`\n\nOptions: `scss`, `sass`, `less`, `stylus`\n\nUsed css preprocessor is specified in this option.\n\n### useImagesForDisplayWithDpi\n\nType: `Array`\n\nDefault: `[96]`\n\nThe pixel density of different screens, which will be supported by your project. Supported values are:\n\n* 96 - 1 dppx (usual display)\n* 192 - 2 dppx (retina display)\n* 288 - 3 dppx (for example, nexus 5)\n* 384 - 4 dppx (for example, nexus 6)\n\nOn the basis of this option, a folder for png images of different sizes for different screens is created. Read more in [images processing](images-processing.md) docs.\n\nThis option can be changed at any time, but there is a couple of important points. If this option is changed after `gulp|tars init`, it is necessary to create (or delete) directories in the `static/img/sprite/` folder by hand. The format of the folder name - option value + dpi. For example, `192dpi`.\n\n### fs\n\nOptions for main folders with static naming. If you change the option from this block after `gulp|tars init` or `gulp|tars re-init`, it is necessary to rename the appropriate directories by hand.\n\n#### staticFolderName\n\nType: `String`\n\nDefault: `'static'`\n\nThe name of the folder where static files of the the project will be. If you are developing a project locally, it is necessary that the value of this option matches with the value of [staticPrefix (deprecated)](#staticprefix) option.\n\n#### imagesFolderName\n\nType: `String`\n\nDefault: `'img'`\n\nThe name of the folder where images of the project will be. Usually this folder has different names, so setting it is optional.\n\n#### componentsFolderName\n\nType: `String`\n\nDefault: `'components'`\n\nThe name of the folder where components (modules for TARS 1.7.0 and below) of the the project will be.\n\n## Deprecated\n\n### useSVG\n\n**Option is deprecated! Use [`svg.active`](#active)**\n\nType: `Boolean`\n\nDefault: `true`\n\nEnabling svg-image support.\n\n### staticPrefixForCss\n\n**Option is deprecated! Value is set in `tars/tars.js`**\n\nType: `String`\n\nDefault: `../imageFolderName/`\n\nCustom path to the folder with the static for css files. imageFolderName is taken from the [imagesfoldername](options.md#imagesFolderName) option.\n\n### useJsLintAndHint\n\n**Option has been renamed to [`lint`](#lint) and moved to js config object.**\n\n### autoprefixerConfig\n\nConfiguration for autoprefixer ([read more here](https://github.com/postcss/autoprefixer#autoprefixer-)). In short, this module allows you not to write vendor prefixes. In this configuration you do not need to include IE8 and IE9, style assembly is done by another way for them . You can look [here](https://github.com/postcss/autoprefixer#browsers) which browsers are available. If you do not want to use autoprefixer, pass `false` in this option.\n\n~~**Option was moved to plugins-config.json.**~~\n\n**Option was moved to .browserslistrc.**\n\n### browserSyncConfig\n\nConfig for the Browsersync module. This module implements the possibility livereload in browser, sharing the markup to an external web, creating a local server.\n\n#### baseDir\n#### port\n#### open\n#### browser\n#### startUrl\n#### useNotifyInBrowser\n#### injectChanges\n\n**Options were moved to plugins-config.json. You can set any [option, which is supported by browsersync](https://www.browsersync.io/docs/options/).**\n\n### staticPrefix\n\nThe value of this option sets the value of the placeholder %=static=% or __static__, which can be used in any project files.\n\n%=staticPrefix=% prefix works, but this prefix is deprecated! Use just %=static=% or __static__!\n\n**Option is deprecated! Value is set in tars/tars.js**\n"
  },
  {
    "path": "docs/en/plugins-options.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/plugins-options.md\">Описание на русском</a>\n</p>\n\n# Plugins configuration\n\nSince TARS 1.8.0 you can configure most plugins (gulp plugins and more) in a separate file `plugins-config.json` in the project root. Before you had to override task using the plugin or even modify the builder files.\n\nYou can change all options, but it is **strongly recommended** to leave some options as default, because TARS depends on them to function correctly. All such options are described in comments in `plugins-config.json`.\n\n`plugins-config.json` is not just a simple json file. You can use commnets and special expression insert(). You can use it to execute JavaScript code inside this json file. For example, `gulp-jade` need option `basedir`, where we can set path to partials. So, we can set it manually and change every time than we decide to change name of components dir. insert() allows us to do it automatically.\n\n```js\n\"gulp-jade\": {\n    \"pretty\": true,\n    \"basedir\": \"markup/insert(tars.config.fs.componentsFolderName)\"\n}\n```\n\nIn that case `insert(tars.config.fs.componentsFolderName)` will be replaced with value of `fs.componentsFolderName` from `tars-config.js`.\n\nSo, that code will be interpreted like:\n```js\n\"gulp-jade\": {\n    \"pretty\": true,\n    \"basedir\": \"markup/components\"\n}\n```\n\nYou can execute any JavaScript code by insert. Some more examples:\n```js\n\"example-plugin\": {\n    \"option\": \"insert(function() {return 'tars'})\"\n}\n```\n\ninsert(function() {return 'tars'}) will be replaced with:\n```js\n\"example-plugin\": {\n    \"option\": \"tars\"\n}\n```\n"
  },
  {
    "path": "docs/en/scenarios.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/scenarios.md\">Описание на русском</a>\n</p>\n\n# Usage scenarios\n\nThere are 3 scenarios of using TARS. In fact, you can up with another scenarios. The main scenarios will be listed here:\n\n* development with a transfer to the back-end for implementing;\n* development of a static site locally.\n* development of a static site that is ready to deploy.\n\nYou can get more info from [FAQ](faq.md).\n\nIn all scenarios, it is mean that the development mode (dev-task) will be available with any keys.\n\n## Development with a transfer to the back-end developer\n\nIn this case, in the tars-config is important to set the minifyHtml option to false. You can also disable removeConsoleLog (false), to retain all console.log unchanged.\n\nIn tars-config, in the devPath option, it is also possible to specify a new path for integration with the back-end part of the project.\n\nSo, for the convenience of builds versioning you can include the useBuildVersioning and useArchiver options, to have the archive ready for sending in each folder with built project.\n\nDuring assembly (build-task) is desirable not to use the `-–release` key.\n\nTo verify efficiency of minified files can be used the `-–min` key.\n\n## Development of a static site locally\n\nIn this case, the minifyHtml option can be any way you want. All other options you can set as comfortable except useArchiver. This option should be turned off because we don't need useless files.\n\nDuring assembly (build-task) is desirable to use the `--release` key.\n\n## Development of a static site that is immediately ready for deploy\n\nAll the same, as for the \"Development of a static site locally.\"\n\nDuring assembly (build-task) you have to use the `--release` key.\n"
  },
  {
    "path": "docs/en/svg-processing.md",
    "content": "\n<p align=\"right\">\nEnglish description | <a href=\"../ru/svg-processing.md\">Описание на русском</a>\n</p>\n\n# Working with SVG\n\nTARS supports two workflows for working with vector graphic: SVG-sprite and SVG-symbols. There are exist some more workflwos (inline SVG in HTML, inline in CSS, base64 in CSS, SVG-stack), but SVG-sprite and SVG-symbols is the best choice at the moment, cause they totally are supported by all browsers (from IE9). That workflows are really fast and it is comfortable to work with them.\n\nYou cannot use symbols and SVG-sprite in one time. All options for working with SVG is set in tars-config.\n\n**It is important that when you save the image in SVG there is have to be viewBox attribute! Save SVG as an object that can be inserted into HTML without changing (in Adobe Illustrator Image location option — Embed).**\n\n## SVG symbols\n\n**Build for IE8 not supported in that workflow**\n\nIn that workflow SVG-images will be combined into one SVG-file and every iscon will be represented as [SVG-symbol](https://developer.mozilla.org/ru/docs/Web/SVG/Element/symbol). You can reuse each icon, set colors and size from CSS in that case. You can get more info from [css-tricks](https://css-tricks.com/svg-symbol-good-choice-icons/). \n\nImages that will be included in such way must be in a folder (default path): 'static/img/svg/'. Nested directories are **not** supported.\n\nSymbols are created to use it in tempaltes (html|jade|hbs). In CSS you can change colors, size, add stroke and stroke width. You sholud use helpers for symbols using in templates and components. Helper creates HTML, add size's attributes and custom classname. \n\nUsing in handlebars:\n```handlebars\n{{Icon iconName='iconName' className='customClass'  iconWidth='25' iconHeight='25'}}\n```\n\nUsing in jade:\n```jade\n!= jadeHelpers.Icon.call(locals, {iconName: 'iconName', className: 'customClass', iconWidth: '25', iconHeight: '25'})\n```\n\nUsing in pug:\n```jade\n!= pugHelpers.Icon.call(locals, {iconName: 'iconName', className: 'customClass', iconWidth: '25', iconHeight: '25'})\n```\n\nYou can set two properites: iconname (iconName), which you'd like to include (without extension), classname for that icon (customClass), sizes (iconWidth, iconHeight). **Sizes are not required, so you can drop it from helper options**. TARS generate class automatically by using template icon__iconName in case you have not passed it to helper. TARS use sizes from svg file if you not passed it to helper. You can use that helper in pages and components too. That helper will generate HTML like:\n```html\n<svg class=\"chrome\" width=\"32px\" height=\"32px\">\n    <use xlink:href=\"#chrome\"></use>\n</svg>\n```\n\nFile with ready symbols is generated by TARS automatically. It only remains to connect it. TARS supports several ways to include SVG-symbols:\n* **inject** — inject into the page code;\n* **separate-file-with-link** — separate file with link from each use to that file;\n* **separate-file** — just separate file.\n\nIn inject case only Icon ID (its name) will be set in symbol use tag. You can manage, where you'd like to inject all symbols by using label %=symbols=%. **It is not necessary to remove that labels and scripts from tempaltes, cause they will be deleted from build automatically, if they are not used!**\nIn case of using separate file with link, path to SVG-symbols file and Icon ID will be passed into xlink:href.\n\n```html\n<svg class=\"chrome\" width=\"32px\" height=\"32px\">\n    <use xlink:href=\"static/images/svg-symbols.svg#chrome\"></use>\n</svg>\n```\n\nIn that case SVG-symbols file will be cached in browser. You can set the path to file by using option pathToExternalSymbolsFile in tars-config. File will be generated in that directory. File will be created in the root directory of build by default.\n\nSVG-symbols loading from separate file is supported in all modern browsers natively except IE9 - Edge. You can use polyfill for them. You can exclude it from build by using option usePolyfillForExternalSymbols if you don't support IE. The code of polyfill including is in templates by default. **It is not necessary to remove that labels and scripts from tempaltes, cause they will be deleted from build automatically, if they are not used!**\n\nIn the third one you have to implement your own workflow of SVG-symbols injecting to HTML. You have to write some code to load SVG-symbols file and inject it into the page-code. There are two useful articles, which describe the best ways to implement it: [css-tricks](https://css-tricks.com/ajaxing-svg-sprite/) and [osvaldas.info](http://osvaldas.info/caching-svg-sprite-in-localstorage). The last is the most cool.\n\nMore info about symbols configuration you can get from [options docs](options.md#svg).\n\n## SVG-sprites\n\nSVG images are combined into the SVG-sprite.\n\nSVG-images in the release-version is minified and has release hash in the name. Images that will be included in such way must be in a folder (default path): 'static/img/svg/'. Nested directories are **not** supported.\n\nYou can include image by using mixin (example on scss):\n```scss\n@include bg-svg($svg-image-name);  // Sprite with svg-images including\n```\n\nAttention, $svg-image-name is a **var**, that has the same name as the icon, which you'd like to use (without extension).\n\n`bg-svg` mixin will include SVG-sprite as a background, will set all necessary offsets and sizes into the CSS. In case of `--ie` and `--ie8` flags using sprite of rastered SVG-images will be created for IE8 automatically.\n\nYou can not set color of SVG icon from CSS. So, it is necessary to create production-ready icon, with correct size and color.\n\n"
  },
  {
    "path": "docs/en/tasks-and-watchers.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/tasks-and-watchers.md\">Описание на русском</a>\n</p>\n\n# Tasks and watchers\n\nTARS is a set of gulp-tasks organized in a special way. Each task is a separate file (except for components files, such as build, dev, etc.), where you can describe transformations of a set of files. Also, where are watchers in TARS, which allow you to start tasks after any file of your project was changed. Tasks and watchers can be system (build in TARS by default) and user's. You can use it to add more features to TARS.\n\nIn general, TARS works in developer mode as follows:\n\n* all tasks, which are used to build your project are started;\n* after build proccess all watchers will be started. They will watch for files in your project and start tasks after file change.\n\nAll built-in tasks are in the `tars/tasks` directory. They are divided into folders according to the task type. built-in watchers are in the `tars/watchers` directory. You can add your own tasks and watchers in `tars/user-tasks` and `tars/user-watchers`.\n\nWhen you add tasks or watchers it is recommended to use:\n* tars.config.fs.staticFolderName - for the name of the folder with statics;\n* tars.config.fs.imagesFolderName - for the name of the folder with images; \n* tars.templater.ext - contains an extensions for files of the selected templater;\n* tars.cssPreproc.ext - contains an extensions for files of the selected css-preprocessor.\n\nIf you need to replace built-in task/watcher, you have to call you own task/watcher like it's built-in. Do not forget to repeat file structure. There is small example, which is true for tasks and watchers: let's imagine, that there is a built-in task `minify-html.js`:\n\n```\ntars/tasks/html/minify-html.js\n```\n\nAnd you need to use your own `minify-html.js`. So, you have to create folder `html` inside `user-tasks` and create file `minify-html.js` there (repeat file structure of built-in task and use the same name of a task):\n\n```\ntars/user-tasks/html/minify-html.js\n```\n\nIn that case only user's task will be included in gulpfile.js over the default one.\n\nIf you need to include your own task into an existing task chain, for example into the dev task, you have to override main:dev task by your custom version of it with the chain that will useful for you.\n\nAlso, you can switch off any task/watcher by adding `_` sign at the begginng of the name of that task/watcher.\n\nYou can get more info in docs for [tasks](tasks.md) and [watchers](watchers.md).\n"
  },
  {
    "path": "docs/en/tasks.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/tasks.md\">Описание на русском</a>\n</p>\n\n# Tasks\n\nEach task is a [CommonJS-module](http://wiki.commonjs.org/wiki/Modules/1.1). All tasks are automatically included in gulpfile. You can create your own tasks in the `user-tasks` directory.\n\nBy default, only links for main tasks are included in gulpfile.js. For example, `build` is a link to `main:build`. So, you can override any task in TARS quite easily.\n\nYou can create your own tasks in `user-tasks` directory. There is an example task included by default. Generally, you could connect any gulp-task to TARS.\n\nBy default, each task requires a set of npm-modules and configs to work correctly:\n\n```javascript\nconst gulp = tars.packages.gulp;\nconst gutil = tars.packages.gutil;\nconst notifier = tars.helpers.notifier;\n```\n\nAlso, if you want to use livereload for this task, you must to connect browserSync module:\n\n```javascript\nconst browserSync = tars.packages.browserSync;\n```\n\nIf you require any dependences, include them here. You can add dependencies, which are not in the main `package.json`, you can add to the `user-package.json`, which is at the root of the project. The format is the same as in the main package.json\n\n**Do not put your own dependencies in package.json. Put them into user-package.json** There is only one exception — initialization via TARS-CLI. `user-package.json` won't be created when you init your project via TARS-CLI with common archive with TARS (from current repository). Also, you can [init TARS with TARS-CLI and your own zip archive with TARS](https://github.com/tars/tars-cli#tars-init). If you need to use some additional packages and initialize project via TARS-CLI, you have to add them to user-package.json in your own TARS fork and all additional packages will end up in package.json of new project automatically after `tars init`. This feature is supported from version 1.1.8 of TARS-CLI.\n\nAfter dependency connection goes the body of a module, which will export the task. Each task is described in an exported function. You have access to global variable `tars` in all tasks and watchers. You can get any info about your current project (config, used prepocessor and so on) from that variable.\nExported function returns the complete gulp-task. After that you can deal with it as with usual task for gulp.\n\nIf you need notification, your task must be ended as follows:\n\n```javascript\n// If you need to reload browser, uncomment the row below\n// .pipe(browserSync.reload({stream:true}))\n.pipe(\n    notifier('Example task is finished \\n')\n);\n```\n\nThe string which is passed to notifier will be displayed in notifications\n\nYou can also call the callback, or return the main thread, if you want to perform tasks in a certain order. Read more [here](http://frontender.info/handling-sync-tasks-with-gulp-js).\n"
  },
  {
    "path": "docs/en/update-guide.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/update-guide.md\">Описание на русском</a>\n</p>\n\n# TARS update guide \n\n**Automatic project-update is available via TARS-CLI and TARS from version 1.5.0. You can get more info from [documentation of TARS-CLI](https://github.com/tars/tars-cli/blob/master/docs/en/update-actions.md). It is not necessary to do anything from this artcile in case of using TARS-CLI!**\n\nIn one major version (for example, 1.\\*.\\*  ), you can use a markup folder (this is the folder in which should be the sources of your project) in any version. In any version within one major version building will be successful. This is true for TARS above (and including) version 1.2.0. Prior to 1.2.0 there were small changes in the file structure and method of including components in the Handlebars. All changes are available in the [changelog](changelog.md).\n\nTo get the new functionality, which was released in a new minor version (for example *.4.* ) is enough:\n\n* [download new TARS](https://github.com/tars/tars/archive/master.zip);\n* initialize it with the settings that are in your current project;\n* transfer the folder markup from the current project to a new TARS;\n* udpate tars-config, if it is necessary.\n\nAfter that, you can use the new features. Learn more about versioning system [here](http://semver.org/).\n\n**Automatic project-update is available via TARS-CLI and TARS from version 1.5.0. You can get more info from [documentation of TARS-CLI](https://github.com/tars/tars-cli/blob/master/docs/en/update-actions.md)!**\n\nThere are some important moments. For example, work with coffee-files has been added in one of the minor versions. If your project uses only JavaScript, you can also use any minor version within the major. If you want to use the coffee-files, you need to select only the version in which tasks for working with them were added or higher version.\n\nIn the [readme](../README.md) is described in which version you have access to the different functionality.\n\nAlso, if you have changed builder files (anything else, except markup folder), it is necessary to apply these changes manually. All recent changes available in [changelog](changelog.md).\n"
  },
  {
    "path": "docs/en/watchers.md",
    "content": "<p align=\"right\">\nEnglish description | <a href=\"../ru/watchers.md\">Описание на русском</a>\n</p>\n\n# Watchers\n\nAs tasks, watchers is a [CommonJS-module](http://wiki.commonjs.org/wiki/Modules/1.1). All watchers are automatically included in a gulpfile.\n\nYou could create your own watcher in a `user-watchers` directory. By default, there is already an example of a watcher. Let's take a closer look.\n\nBy default, each watcher requires a set of npm-modules and configs to work correctly:\n\n```javascript\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\nconst gutil = tars.packages.gutil;\nconst chokidar = tars.packages.chokidar;\nconst watcherLog = tars.helpers.watcherLog;\n```\n\n```javascript\n    return chokidar.watch(\n        /* String of path pattern or array of strings */,\n        Object.assign(tars.options.watch, {\n            // Options set bellow will override default from tars.options.watch\n            // If you need default options, you can use just tars.options.watch\n            ignored: /* String of path pattern or array of strings to ignore. If nothing to igonre — just set it to ''*/,\n            persistent: /* Boolean, true by default*/,\n            ignoreInitial: /* Boolean, true by default*/\n        })\n    ).on('all', function(event, path) {\n        watcherLog(event, path);\n        // You could start as many tasks as you need\n        runSequence(/* Task name (String) to start */);\n    });\n```\n\nYou can pass a pattern or pattern arrays of path to files for which you need to watch into `chokidar.watch`.\n\nYou can pass options for `chokidar` after patterns. If default options are ok for you, you can pass just `tars.options.watch` as the second argument of `chokidar.watch`. If you need to override some options, you have to use [`Object.assign`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign).\n\nYou can pass a pattern or an array of patterns of paths to files that you want to filter from watching within current watcher into the option `ignored`.\n\nTask name is passed to `gulp.start`, which should be run on any changes in watched files. By default watchers work for all file operations (delete, create, rename). You can change this behavior by changing the `.on('all', function(event, path)` to the needed event. List of available events is in [chokidar docs](https://github.com/paulmillr/chokidar#getting-started).\n"
  },
  {
    "path": "docs/ru/changelog.md",
    "content": "<p align=\"right\">\n<a href=\"../en/changelog.md\">English description</a> | Описание на русском\n</p>\n\n# Changelog\n\n## Version 1.9.9\n\n* Исправлены: #343\n\n## Version 1.9.8\n\n* Обновлены версии зависимых пакетов\n* Исправлены: #318,#324, #336, #325\n\n## Version 1.9.7\n\n* Добавлена поддержка [ProvidePlugin](https://webpack.github.io/docs/list-of-plugins.html#provideplugin) у webpack. Настройка происходит в [конфиге](https://github.com/tars/tars/blob/master/docs/ru/options.md#provideplugin).\n\n## Version 1.9.4\n\n* Папка build не удаляется при запуске TARS в dev-режиме.\n\n## Version 1.9.2\n\n* Исправлен баг с работой хелпера Icon в handlebars.\n\n## Version 1.9.1\n\n* Переключились на gulp-pug-inheritance из форка, так как оригинал содержит ошибки.\n\n## Version 1.9.0\n\n* gulp-minify-html заменен на gulp-htmlmin.\n* Добавлена поддержка шаблонизатора Pug.\n* Добавлена возможность передачи любых данных в шаблоны с помощью переменной окружения.\n* Вычитана документация на английском языке, спасибо большое [icehaunter](https://github.com/icehaunter).\n* Исправлены баги.\n* Обновлена документация.\n* Обновены версии зависимостей.\n\n## Version 1.8.3\n\n* Пофикшен баг с svg2png. Испольузется 1.0.2 версия пакета.\n\n## Version 1.8.2\n\n* Вотчер за шаблонами стал умнее.\n* Для Jade используется свой шаблон по умолчанию для компонента.\n* Обновление зависимостей сборщика. Eslint обновлен до версии 3.x.x.\n\n## Version 1.8.1\n\n* Проект можно заинитить без user-package.json\n* Добавлен autoprefixer для IE9 в режиме ручной сборки стилей.\n* Поправлены пути до партиалов в точках входа для IE.\n* Обновление зависимостей сборщика.\n\n## Version 1.8.0\n\n* modules теперь называются components. При этом это название [конфигурируемо](options.md#componentsfoldername). Можете использовать modules как и раньше.\n* Таск concat-modules-data переименован в concat-mocks-data.\n* Исправлен лог ошибки при сборке спрайтов в случае, если иконка не найдена.\n* Появилась возможность задавать конфиг для используемых в TARS плагинов с помощью [plugins-config.js](plugins-options.md).\n* Ускорена пересборка Jade-шаблонов при изменении data-файлов.\n* При добавлении SVG и использовании symbols Jade-шаблоны теперь не пересобираются. Необходимо сохранять вручную шаблоны и страницы, на которых используется иконка. Такое решение принято, чтобы не нужно было каждый раз ждать полной пересборки всех шаблонов при добавлении иконки. Изменение касается только Jade.\n* Появилась возможность вкладывать компоненты друг в друга.\n* Изображения из assets компонентов хранятся в static/img/assets, остальные файлы из assets будут хранится в static/components-assets. К изображениям относятся файлы svg, png, jpg, jpeg, jpe, gif, tiff и bmp.\n* Опция staticPrefix удалена из конфига. Теперь она генерируется автоматом.\n* Добавлена опция [generateStaticPath](options.md#generatestaticpath), которая включает построение относительного пути от текущей страницы до папки со статикой. В случае использования сервера, который будет раздавать статику (например, режим livereload) путь до статики не будет генерироваться, так как статика раздается сервером.\n* Имя билда теперь генерируется, как в TARS 1.6.0 Используется локальное время.\n* TARS работает в NodeJs версии 6.x.x\n\n## Version 1.7.1\n\n* Значительно ускорена пересборка Jade-шаблонов.\n* Обновлена версия gulp-csso до второй версии.\n\n## Version 1.7.0\n\n* Удален плагин gulp-strip-debug. Теперь его работой занимается uglifyJS.\n* Обновлен вывод при ошибке. Он стал более понятный, сразу ясно, куда смотреть в логах.\n* notifier.success и notifier.error теперь можно использовать как в pipe, так и в обычных функциях. Сообщение об ошибке легко найти в консоли.\n* Обновлен состав конфига сборщика. Конфиг стал более компактным.\n* Появилась [возможность импортить стили из node_modules/bower_components](css-processing.md) не указывая полный путь до пакета, а использовать сокращенный путь.\n* Добавлен [webpack](https://webpack.github.io/) для сборки JavaScript. Также осталась возможность использовать старый workflow для работы с JavaScript — простая склейка файлов. Управление [workflow происходит в конфиге сборщика](options.md#workflow-1). Также есть возможность использовать [Hot Module Replacing](https://webpack.github.io/docs/hot-module-replacement.html). Эта фича опциональна, управляется из [конфига проекта](options.md#usehmr).\n* Обновлены таски main:dev и js:processing. Обратите внимание на них, если они переопределены в вашем проекте.\n* Обновлен .babelrc.\n* Обновлен .eslintrc, так как был произведен переход на вторую версию eslint.\n```js\n// Обновленные/добавленные правила:\nenv: {\n    commonjs: true\n},\n\nparserOptions: {\n    ecmaVersion: 6,\n    sourceType: 'module'\n},\n\nrules: {\n    'consistent-return': 0,\n    'keyword-spacing': 2,\n    strict: 0,\n    'no-confusing-arrow': 2,\n    'prefer-arrow-callback': 0,\n    'no-debugger': 0\n}\n\n// Удаленные правила:\n'no-arrow-condition': undefined,\n'space-return-throw-case': undefined,\n'space-after-keywords': undefined,\n'no-empty-label': undefined,\n'no-process-exit': undefined\n```\n* Обновлена документация.\n* Обновлены версии зависимостей.\n\n## Version 1.6.3\n\n* Поправлен баг с минификацей изображений в релизной сборке. До этого фикса минификация не происходила.\n* Таск minify-raster-img был переименован в minify-images. Теперь в нем еще минифицируются SVG-изображения, не являющиеся иконками.\n* Правки в документации по HTML-компиляции.\n\n## Version 1.6.2\n\n* Icon helper был переименован из icon в Icon.\n* В is helper были добавлены операции != и !==.\n\n## Version 1.6.1\n\n* Пофиксил таски для переноса контентных изображений.\n\n## Version 1.6.0\n\n* Sourcemaps создаются только в dev-режиме.\n* Пропущенные таски слегка подсвечиваются в общем логе Gulp.\n* Все таски для работы со стилями теперь общие для всех препроцессоров. Они больше не скачиваются и сразу находятся в TARS.\n* Стили для IE9 компилятся в отдельном таске.\n* Вотчеры за изменениями в стилях стали умнее. Теперь они будут вызывать только те таски, которые действительно нужны в данный момент.\n* Таски для компиляции HTML объединены в один.\n* **Убрана поддержка Node.js версии ниже 0.12.x включительно.**\n* Опция инжекта CSS при livereload [вынесена в tars-config.js](options.md#injectchanges). Если вам нужен инжект стилей при пересборке без перезагрузки страницы, то необходимо установить эту опцию в true.\n* jscs + jshint были заменены на eslint. Проверка кода проходит куда быстрее. Весь код TARS также подвергается проверке eslint перед каждым коммитом.\n* **[Появилась возможность пробрасывать данные одного модуля в данные другого с помощью функций в data.js](html-processing.md#Работа-с-модулями-и-данными-в-handlebars). Теперь стало легко инициализировать модули с вложенными модулями с любыми данными в Handlebars.**\n* Рефакторинг кода.\n    - Были отрефакторены все таски. Используется ES6.\n    - Ускорен запуск самой сборки. Теперь зависимости подключаются только в тот момент, когда таск запускается в первый раз. Первоначальная сборка в итоге занимает меньше времени.\n    - Добавлены новые методы и свойства в tars.js:\n        + метод skipTaskLog — выводит лог о пропущенных тасках с информацией о причинах пропуска;\n        + хелпер skipTaskWithEmptyPipe — позволяет пропустить таск, если в pipe не было передано ни одного файла.\n        + Свойство root — хранит путь от корня ОС до папки tars, включая саму папку.\n        + Свойство isDevMode — возвращает результат выражения !tars.flags.release && !tars.flags.min\n    - В gulpfile.js находятся только ссылки на таски. Это сделано с целью более легкой кастомизации TARS. Сами таски перенесены частично в tasks/main и в вотчеры. Подробности далее.\n    - Удален таск browsersync. Browsersync включается внутри таска main:dev\n    - Таски svg-action и compile-html-with-data-reloading перемещены в вотчеры напрямую, без создания доп. тасков.\n    - Таск minify-html переименован в modify-html, так как в этом таске происходит не только минификация html, но и форматирование.\n    - Таск pre-build переименован и перенесен в namespace main.\n* [Появилась возможность использовать css-файлы отдельно от общего бандла](css-processing.md).\n* Весь js-код из папки static по умолчанию находится в ignore в babelrc. Сам babel обновлен до 6 версии. Если вы хотите использовать самый последний TARS-CLI, в старых проектах необходимо поправить конфиг .babelrc, так как это сделано в текущей версии. По умолчанию TARS-CLI сам попытается это сделать, но в случае ошибки это придется сделать пользователю.\n* Обновление шаблона страницы и модуля head. Убраны лишние атрибуты, приведено к виду в [html5boilerplate](https://github.com/h5bp/html5-boilerplate) последней версии.\n* **Вместо префиксов %=staticPrefixForCss=% и %=staticPrefix=% можно использовать просто %=static=% или \\_\\_static\\_\\_ как в html, так и в css. Старые префиксы работают, но лучше использовать новый вариант.**\n* staticPrefixForCss был удален из tars-config, генерируется в tars/tars.js Представляет собой обычное поле-строку.\n* normalize обновлен до 3.0.3\n* **[Добавлена возможность использовать кастомные хелперы для Handlebars и Jade.](html-processing.md)**\n* Добавлен хелпер icon для Jade и Handlebars, который генерирует шаблон для подключения svg-symbol в HTML.\n* Появилась возможность использовать [svg-символы](svg-processing.md#svg-symbols). Доступны 3 режима работы с symbols. Сборка для IE8 не производится, при выборе этого способо работы с SVG. В separate-js добавлен полифил для корректной загрузки символов из отдельного файла для IE и других браузеров, которые этого не поддерживают.\n* Поле useSVG удалено из конфига. Теперь SVG конфигурируется [отдельным объектом в tars-config](options.md#svg). Если поле есть (в случае использования старого конфига), то будет использоваться оно и генерироваться SVG-спрайт.\n* [В данных всегда генерируется массив с информацией о всех страницах проекта](html-processing.md#html).\n* Спрайты (svg, svg-symbols, png) версионируются при использовании флага `--release`.\n* port для Browsersync можно задать с помощью [переменной окружения](options.md#open).\n* Обновлен [конфиг autoprefixer по умолчанию](options.md#autoprefixerconfig). Удалена поддержка префиксов для ios 5.0. Доля этой ОС меньше 1% на данный момент.\n* Путь до папки со скриптами, картинками и стилями генерируется автоматом для страниц, в соответствии с их (страниц) вложенностью в директории. Теперь опцию  %=static=% (\\_\\_static\\_\\_) не нужно править руками для каждой сборки, если у вас в pages есть иерархия каталогов.\n* При сборке проекта без ключей `--ie`, `--ie9`, `--ie8` вырезаются все соответствующие условные комментарии. В готовый билд больше не попадает лишних файлов. Например, при сборке без ключа `--ie` или `--ie8` файл html5shiv не переносится в билд\n* Удален hml5shiv-print.\n* Внтури data-файлов можно использовать JavaScript-объект, в случае, если IDE ругается на текущий синтаксис data-файла.\n* Появилась возможность [инициализировать проект без изменения файлов шаблонизатора или css-препроцессора](https://github.com/tars/tars-cli/blob/master/docs/ru/commands.md#tars-init). Это будет полезно владельцам форков.\n* [Появилась возможность автоматического обновления TARS в проекте с помощью TARS-CLI](https://github.com/tars/tars-cli/blob/master/docs/ru/commands.md#tars-update-project).\n* **Таск re-init теперь запрещен для использования. В дальнейшем эта команда не будет поддерживаться и будет удалена из проекта, так как есть вероятность сломать проект при ее использовании.**\n* Обновленна документация.\n\n## Version 1.5.0\n\n* Пофиксил установку в NPM3. В том случае, если у вас есть проект, который был разработан на TARS 1.4.1 и NPM2, а сейчас вы используете NPM3, необходимо заменить одну строку в tars/tars.js:\n```javascript\nhandlebars: tars.require('gulp-compile-handlebars/node_modules/handlebars'),\n// заменить на\nhandlebars: tars.require('handlebars'),\n```\n* Используется Handlebars из отдельно установленного пакета, а не из gulp-handlebars.\n* Добавлена возможность использования css-файлов в папке etc.\n\n## Version 1.4.1\n\n* Добавлен понятный лог при ошибках в css.\n* Обновлена [документация по использованию Babel](js-processing.md).\n* Поправлен конфиг html-prettify.\n* Нотификации при ошибках появляются, даже если они отключены.\n* Обновлены версии зависимостей, пофикшены баги.\n\n## Version 1.4.0\n\n* Добавлена возможность использовать import в стилях. Css (less, scss, sass, styl) файлы с _ в начале файла не компилируются. Только их рекомендуется импортировать. [Подробности в документации](css-processing.md).\n* Добавлена поддержка .sass расширения для файлов стилей.\n* Обновлен tars-config. Поле [sourcemaps](options.md#sourcemaps) теперь имеет больше опций. Добавлен конфиг включения [Babel](options.md#usebabel).\n* Добавлена поддержка синтаксиса ES6(ES.Next) с помощью [Babel](options.md#usebabel). [Подробности в документации](js-processing.md).\n* Autoprefixer вставляется самым последним, сразу после всех используемых постпроцессоров.\n* Notifier получил единый интерфейс. При отключенных нотификациях теперь не будет вообще никаких уведомлений в системе, даже при ошибках. Ошибки будут отображаться только в консоли. При включенных все будет как обычно. Поменялся формат нотификаций в системе, теперь выводится иконка TARS.\n* Добавлен gulp-html-prettify. Теперь скомпилированный html будет отформатирован, если опция [minifyHtml](options.md#minifyhtml) установлена в false.\n* Стили для IE9 не собираются автоматически. Для того, чтобы получить сборку необходимо использовать флаг `--ie9` или `--ie`, чтобы собрать под IE8 и IE9.\n* Добавлены хелперы для Handlebars. Описана возможность добавления своих хелперов. Хелперы перенесены в репозиторий tars-handlebars и находятся рядом с тасками.\n\n## Version 1.3.1\n\n* Фикc конфига для PostCSS. Теперь не надо руками реквайрить постопроцессоры. Вы просто перечисляете постпроцессоры, которые хотите использовать в конфиге и все. Но не забудьте установить локально используемые постпроцессоры через NPM.\n\n## Version 1.3.0\n\n* Добавлены sourcemaps для JavaScript. Теперь можно увидеть в браузере не только файл из исходников, но даже путь до этого файла.\n* Добавлен [PostCSS](https://github.com/postcss/postcss) и [возможность добавлять любые другие постпроцессоры](options.md#postcss). Отдельно использовать PostCSS пока нельзя, только совместно с каким-либо препроцессором.\n* Убраны нотификации во время сборки. Теперь они будут появляться только тогда, когда они действительно нужны.\n* Добавлена поддержка расширения .hbs для Handlebars-шаблонов.\n* Добавлен padding между картинками в растровом спрайте.\n* Отрефакторены основные модули и страницы.\n* Теперь browsersync открывает бразер, установленный в системе по умолчанию, если [не указано иначе](options.md#browser).\n* Созадана новая сущность, tars, которая содержит в себе все методы и ссылки на зависимости, необходимые сборщику.\n* [Создан TARS-CLI](https://github.com/tars/tars-cli/blob/master/README_RU.md).\n* Поправлены различные баги.\n\n## Version 1.2.7\n\n* Поправлен баг в gulp-svg-spritesheet.\n\n## Версия 1.2.6\n\n* Поправлен баг нотификацией, когда она отключена.\n\n## Версия 1.2.4\n\n* Поправлен баг с инициализацией TARS.\n* Исправлена ошибка при собирании png-спрайта\n\n## Версия 1.2.3\n\n* Починил баг работы TARS c выкюченным нотификатором.\n\n## Версия 1.2.2\n\n* Внесен фикс в вотчер assets-файлов модуля. На данный момент поддиректории в папке assets в модуле не поддерживаются.\n\n## Версия 1.2.1\n\n* Обновлен code-style. Обновлен .jscsrc\n* Добавлено описание workflow для [контрибутеров](for-contributors.md).\n* Убрал модуль path из зависимостей.\n* Добавлены доки на английском языке.\n\n## Версия 1.2.0\n\n* Новая версия [Browsersync](https://www.browsersync.io/).\n* Опция [baseDir](options.md#basedir) для Browsersync перемещена в tars-config.\n* Вотчеры используют модуль [chokidar](https://github.com/paulmillr/chokidar)\n* Все вотчеры переехали в отдельные файлы в папку tars/watchers.\n* Сделана автозагрузка вотчеров и тасков в gulpfile.\n* Таск 'builder-start-screen' переехал в tars/tasks/services.\n* Добавлены новые хэлперы в handlebars (и [документация по ним](handlebars-helpers.md)). Все хелперы хранятся в отдельном файле tars/helpers/handlebars-helpers.js\n* Добавлена папка framework по пути markup/static/js Папка предназначена для js-файлов используемого фреймворка.\n* Обновлены зависимости.\n* Изменился синтаксис подключения модулей при использовании Handlebars. Старый синтаксис:\n```handlebars\n{{> modules/head/head head.defaults}}\n```\n\nНовый:\n```handlebars\n{{> head/head head.defaults}}\n```\n\n* Больше нет отдельного таска для компилирования стилей для ie9. Стили для ie9 компилируются в рамках таска компилирования стилей для всех современных браузеров. Отдельный файл создается.\n* Поменялся workflow подготовки svg-графики. Кодирование в base64 было заменено на отдельный svg-sprite. Использование в коде не изменилось.\n* mData/mData.js –> data/data.js\n\n## Версия 1.1.1\n\n* Исправлен баг в таске переноса js из separate-js. Было указано старое название папки.\n\n## Версия 1.1.0\n\n* Добавлен user-package.json для пользовательских зависимостей. Изменения в tars/helpers/install-additional-deps.js\n* Добавлено [руководство по обновлению TARS](update-guide.md)\n* Обновлен модуль [gulp-sass](https://www.npmjs.com/package/gulp-sass).\n* Генерация версии сборки перенесена в отдельный хелпер, что упрощает ее кастомизацию. Находится тут: tars/helpers/set-build-version.js\n"
  },
  {
    "path": "docs/ru/css-concat-processing.md",
    "content": "<p align=\"right\">\n<a href=\"../en/css-concat-processing.md\">English description</a> | Описание на русском\n</p>\n\n# CSS concat processing\n\nСклейка стилей происходит в следующем порядке:\n* Normalize\n* Стили для библиотек\n* Mixins, sprites\n* Fonts\n* Vars\n* GUI\n* Common stylies (common.scss)\n* Стили для плагинов (static/scss/plugins, включая все поддиректории)\n* Стили компонентов (.css поддерживается)\n* Стили из etc.{scss,css}\n\nТакже есть возможность использовать CSS-файлы, не включая их в общий бандл. Для этого в папке static/scss есть папка separate-css, в которой вы можете положить все css-файлы, подключением которых вы будете управлять самостоятельно. Пример подключения такого файла в любом шаблоне:\n\n```handlebars\n<link href=\"%=static=%css/separate-css/your-file.css\" rel=\"stylesheet\" type=\"text/css\">\n```\n\n**Префикс %=staticPrefix=% все еще работает, но крайне не желательно его использовать, так как в будущих версиях он будет удален! Используйте просто %=static=% или \\_\\_static\\_\\_!**\n"
  },
  {
    "path": "docs/ru/css-manual-processing.md",
    "content": "<p align=\"right\">\n<a href=\"../en/css-manual-processing.md\">English description</a> | Описание на русском\n</p>\n\n# CSS manual processing\n\nДанный подход будет полезен, если вам не хватало контроля над сборкой стилей при автоматической конкатенации. В данном режиме вы полностью управляете процессом (и порядком) сборки стилей в проекте. Ручное управление стилей досутпно с TARS версии 1.8.0 и выше.\n\nОсновные точки входа, файлы стилей, в которые будут импортироваться стили вашего проекта, находятся в папке static/scss/entry. По умолчанию там уже находится одна точка входа — main.scss Вы можете добавить еще точек входа, если вам это потребуется. Именно эти файлы будут компилироваться препроцессором. Файлы вашего проекта необходимо подключать в точки входа с помощью конструкции @import.\n\nПодключение точки входа по умолчанию (main) уже описано в шаблонах (components/head/). В случае добавления новых точек входа, их требуется подключать в шаблонах вручную.\n\nСодержимое main.scss выглядит следующим образом:\n\n```scss\n@import '../normalize.scss';\n\n/* Libraries, which is used in current project. */\n@import 'partials/_libraries.scss';\n\n/* Libraries, which is used in current project. */\n@import 'built-in-partials/_service.scss';\n\n/* Plugins, which is used in current project. */\n@import 'partials/_plugins.scss';\n\n/* Components, which is used in current project. */\n@import 'partials/_components.scss';\n\n/* Additional style files. */\n@import '../etc/etc.scss';\n```\n\nВ точку входа импортируется normalize.scss, затем партиал, в который вы можете импортировать библиотеки, затем встроенные партиалы (различные миксины для правильной работы с графикой в проекте и т.д.), партиал с плагинами, партиал с компонентами и другие стили.\n\nПартиал с компонентами означает, что именно в этот файл вы будете импортировать стили своих компонентов. При этом вам не обязательно указывать относительный путь до стилей компонентов от файла партиала. Достаточно сделать так:\n\n```scss\n@import 'components/_template/_template.scss';\n```\n\nПодключение стилей для плагинов и библиотек из node_modules и bower_components описано в [общей доке по работе со стилями](css-processing.md).\n\nБольшая просьба: **не редактируйте файлы из директории built-in-partials, они могут быть перезаписаны в результате обновления проекта!**.\n\nТакже в entry есть директория ie, в которой вы можете добавить точки входа для ie8 и ie9. Точки входа для ie9 должны иметь суффикс _ie9, а для ie8 — _ie8.\n\nОбратите внимание, для этих точек входа вам необходимо подключать стили компонентов, если они есть для этих браузеров. Нет необходимости дублировать содержимое _components и _components-ie9. В _components-ie9 должны быть только стили компонентов для ie9.\n\n"
  },
  {
    "path": "docs/ru/css-processing.md",
    "content": "<p align=\"right\">\n<a href=\"../en/css-processing.md\">English description</a> | Описание на русском\n</p>\n\n# CSS\n\nВ качестве CSS-препроцессора можно использовать:\n* [Scss](http://sass-lang.com) также поддерживается .sass;\n* [Less](http://www.lesscss.org);\n* [Stylus](http://learnboost.github.io/stylus).\n\nCSS-препроцессор выбирается в [tars-config.js](options.md#csspreprocessor).\n\nВ целом, нет каких-либо неожиданностей при использовании CSS-препроцессора. Используем все возможности, которые предоставляет выбранный инструмент.\n\nЕсли вы привыкли к обычному CSS, вы можете использовать CSS-синтаксис в любом препроцессоре.\n\nВ TARS поддерживается два подхода для работы со стилями:\n* [автоматическая склейка стилей сборщиком](css-concat-processing.md);\n* [Ручное управление подключаемыми стилями](css-manual-processing.md).\n\nВсе, что описано ниже справедливо для обоих подходов.\n\nВсе файлы с префиксом _ не будут компилироваться сборщиком. Эти файлы нужно использовать для импортов. На самом деле вы можете импортировать любые файлы, но если вы импортируете файл, который итак попадет в бандл, у вас будет две копии одного и того же файла. Поэтому файлы с префиксом _ не компилируются. Импортировать можно как файлы препроцессора, так и обычные CSS-файлы.\nПример импорта на scss(sass):\n\n```scss\n// файлы лежат в одной директории\n@import '_partial.scss';\n\n// _partial.sass лежит в соседней директории partials\n@import '../partials/_partial.sass';\n```\n\nЕсли требуется подключить файлы из node_modules или bower_components, можно не писать полный путь, а использовать сокращенный синтаксис, TARS сам достроит путь:\n\n```scss\n@import 'bootstrap/dist/bootstrap.scss';\n```\n\nВ случае такого импорта TARS попытается найти bootstrap/dist/bootstrap.scss в node_modules и bower_components. Данная функциональность доступна с версии TARS 1.7.0\n\nЕсли требуется подключить файлы из директории static (картинки), то необходимо пользоваться плейсхолдером %=static=% или \\_\\_static\\_\\_. Тогда подключение картинки в качестве background (в данном примере картинка будет взята из вашего компонента main) будет выглядеть следующим образом (в примере используется scss):\n\n```scss\n.main {\n    background: url('%=static=%assets/main/bg.png') repeat;\n}\n```\n\n**Префикс %=staticPrefixForCss=% все еще работает, но крайне не желательно его использовать, так как в будущих версиях он будет удален! Используйте просто %=static=% или \\_\\_static\\_\\_! Новый вариант префиксов работает в TARS, начиная с версии 1.6.0**\n\nЕсть пара моментов по организации scss|sass|less|styl-файлов (далее считаем, что был выбран scss в качестве CSS-препроцессора):\n\n* Каждый компонент имеет свое CSS-представление.\n* Общие стили для проекта рекомендуется складывать в common.scss в static/scss\n* Подключение шрифтов в fonts.scss\n* Миксины в mixins.scss\n* Описание стилей UI-элементов в GUI.scss\n* Переменные в vars.scss\n* Стили библиотек в static/scss/libraries (может содержать подпапки и CSS-файлы)\n* Стили для плагинов в static/scss/plugins (может содержать подпапки и CSS-файлы)\n* Стили, которые не ясно, куда определить, помещаем в static/scss/etc/etc.{scss,css}\n* В основной папке с CSS (в данном случае это папка scss) нельзя создавать новые файлы (кроме тех случаев, когда вы сами правите таски, связанные с работой с css). Новые файлы можно создавать только в static/scss/plugins|libraries|etc|separate-css.\n\nЕсли вам необходимо подключить стили bower- или npm-пакета, то используйте import нужных стилей из пакета.\n\nДля браузеров IE8 и IE9 можно размещать отдельные фиксы в папке ie в папке компонента. Нужно создать ie8.{scss,sass,css} или ie9.{scss,sass,css}, в соответствии с тем, в какой браузер вносится фикс.\n"
  },
  {
    "path": "docs/ru/faq.md",
    "content": "<p align=\"right\">\n<a href=\"../en/faq.md\">English description</a> | Описание на русском\n</p>\n\n# FAQ\n\nПо всем вопросам можно обращаться в [gitter](https://gitter.im/tars/tars?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) или по почте [tars.builder@gmail.com](mailto:tars.builder@gmail.com).\n\n1. **У меня webpack и NPM-scripts, я не понимаю, зачем нужен TARS с Gulp?**\nДля всего есть свой инструмент. Естественно, можно извернуться и для всех своих задач использовать только NPM-scripts. Но Gulp — это не только таск-менеджер (что уже делает его на одну ступень выше по удобству, чем NPM-скрипты), но и возможность легко переносить файлы в поток. С NPM-скриптами уже не так просто сделать правильную параллельную обработку задач. В любом случае потребуется еще некий index.js, в котором будет отдельно реализован последовательный flow выполнения тасков и параллельный. Также, не забываем, что и асинхронные задачи бывают.\nНасчет именно webpack: инструмент был создан для того, чтобы разрешать зависимости в JavaScript изначально. Сейчас его обвесили еще плагинами, но его главная задача так и осталась прежней. Отсюда следует, что Gulp + webpack = любовь, они не конкуренты друг другу.\nМожно почитать комментарии на эту тему [в документации к webpack + Gulp](http://webpack.github.io/docs/usage-with-gulp.html).\n\n2. **Почему именно Gulp, а не Grunt?**\nGulp это потоковый сборщик проектов на JavaScript. Он использует Streams и действительно является очень быстрым. Для примера у меня есть проект, где около тысячи stylus файлов, Grunt'у нужно примерно 2.5 секунды на сборку и 2 секунды на обработку autoprefixer'ом. Gulp все это делает за 0.5 секунды выигрывая у Grunt минимум в 4 раза.\n\n3. **Как лучше построить процесс разработки с помощью TARS?**\nЕдиного ответа тут нет. Все зависит от специфики разработки. Рассмотрим несколько типов проектов.\n    * Долгоиграющий и единственный. В этом случае все просто. Создавайте компоненты, страницы, храните все в какой-либо CVS — в общем, этот сценарий самый скучный.\n    * Много проектов с повторяющейся функциональностью. В этом случае есть несколько путей работы с TARS:\n        - создать библиотеку переиспользуемых блоков и включить ее сразу в собственный форк TARS. Таким образом, при ините нового проекта в нем сразу будут все нужные блоки;\n        - использовать git или любую другую CVS. Пусть заиниченный TARS находится в git, а каждый новый проект — отдельная ветка;\n        - хранить библиотеку повторяющихся блоков отдельно.\n    * Много разных проектов. Также весьма простой сценарий, при котором каждый проект может быть отдельным репозиторием в git (или другой CVS).\n\nУказанные способы выше — не догма, а лишь пример, как получить больше пользы от TARS.\n\n4. **У нас в команде есть свой сборщик на Gulp/Grunt, хотелось бы использовать наработки из него в TARS.**\nМожете перенести необходимые таски в user-tasks. Для использования grunt-тасков, если не хотите переписывать на Gulp, есть пакет [gulp-grunt](https://www.NPMjs.com/package/gulp-grunt), который запускает grunt-таск в Gulp. Но все же рекомендуем портировать grunt-таск в Gulp. Тем более, все плагины для Grunt доступны в Gulp. Если необходимо, чтобы проект инитился всегда с этими дополнительными тасками, то рекомендуем создать форк TARS, добавить в нем необходимые изменения, [инитить проект, с указанием ссылки на ваш форк](https://github.com/tars/tars-cli/blob/master/docs/ru/commands.md#tars-init). При этом, для упрощения обновления форка, все кастомные таски следует складывать в users-tasks, а зависимости для этих тасков указывать в user-package.json. Они будут ставиться с каждым заиниченым проектом.\n\n5. **У меня OS X (Ubuntu, Linux Mint ...) В готовую сборку попадают не все файлы проекта.**\nНужно увеличить [ulimit](options.md#ulimit) в tars-config.js\n\n6. **Я ничего не понимаю в Gulp, могу ли я комфортно пользоваться данным сборщиком?**\nЗнания работы с Gulp не обязательны. На данный момент сборщик покрывает большинство задач frontend'а. Все, что нужно знать — описано в документации.\n\n7. **Мне кажется, что используется слишком сложная файловая структура. Могу ли я ее модифицировать так, как нужно мне?**\nЕсли вы умеете работать с Gulp, то после переименования/удаления/создания папок, необходимо править соответсвующие таски или [создавать user-tasks](tasks.md). Некоторые каталоги не обязательны и могут быть спокойно удалены.\nТакже можно спокойно расширять файловую структуру для JavaScript с использованием [опции](options.md#jspathstoconcatbeforemodulesjs-%D0%B8-jspathstoconcataftermodulesjs) в конфиге сборщика.\nДля основной папки со статикой и папки с картинками можно задать имя в [опциях](options.md#fs) в конфиге сборщика.\n\n8. **Вроде бы все поставилось, но ничего не работает. Что делать? У меня Windows (7, 8, 10)**\nСкорее всего не все зависимости поставились. Запустите команду `NPM i` еще раз.\nЕсли в результате выполнения данной команды есть ошибки, то большая просьба прислать их на почту ([tars.builder@gmail.com](mailto:tars.builder@gmail.com)) или в [gitter](https://gitter.im/tars/tars?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge).\n"
  },
  {
    "path": "docs/ru/file-structure.md",
    "content": "<p align=\"right\">\n<a href=\"../en/file-structure.md\">English description</a> | Описание на русском\n</p>\n\n# Файловая структура\n\n**Вся файловая структура генерируется автоматически. Руками ничего создавать не нужно!**\n\nСборщик имеет следующую файловую структуру:\n\n```\n├── gulpfile.js             # gulpfile сборщика\n├── tars.json               # Системный файл с информацией о текущей версии\n├── tars-config.js          # Конфигурационный файл\n├── package.json            # Основные зависимости\n├── .babelrc                # Конфиг для Babel\n├── .eslintrc               # Конфиг для eslint\n├── user-package.json       # Пользовательские зависимости\n└── tars/                   # Таски и хелперы для gulp\n    ├── helpers/            # Хелперы\n    ├── tasks/              # Основные таски (разложены по папкам в соответствии с типом таска)\n    ├── user-tasks/         # Пользовательские таски\n    ├── watchers/           # Основные вотчеры (разложены по папкам в соответствии с типом отслеживаемых файлов)\n    ├── user-watchers/      # Пользовательские вотчеры\n    └── tars.js             # Основной файл сборщика\n├── markup/                 # Основная папка с проектом\n    ├── components/         # Компоненты\n    ├── pages/              # Шаблоны страниц\n    └── static/             # Различная статика (css, js и т.п.)\n└── docs/                   # Документация\n```\n\n\n## Структура отдельного компонента\n\nКомпонент — самостоятельная единица на странице. Пример компонента — «header» или «footer». Каждая страница состоит из компонентов. Компоненты могут подключать друг друга и быть вложены друг в друга.\n\n```\nexampleComponent/                             # Пример компонента\n    ├── assets/                               # Файлы, относящиейся только к данному компоненту (файлы любого типа) Поддиректории не поддерживаются.\n    ├── ie/                                   # Cтили для IE8 и IE9 (ie9.scss|sass|less|styl и ie8.scss|sass|less|styl)\n    ├── data/                                 # Папка для хранения данных для компонента\n        └── data.js                           # Данные для компонента в виде js-объекта (формат объекта есть в компонентк-примере _template)\n    ├── exampleComponent.html                 # Html-представление компонента (также может иметь расширение jade или hbs, в зависимости от выборанного шаблонизатора)\n    ├── exampleComponent.scss|sass|less|styl  # Css-представление компонента (scss|sass|less|styl, в зависимости от выбранного css-препроцессора)\n    ├── exampleComponent.js                   # Js-представление компонента\n    └── anotherComponentFolder\n```\n\nЛюбой компонент может быть вложен (как структурно, так и в коде) в любой другой.\n\nИзображения из директории assets в результате сборки будут перемещены в static/img/assets/имя_компонента или static/img/assets/имя_компонента/имя_вложенного_компонента, если у компонент вложен в другой компонент. К картинкам относятся: svg, png, jpg, jpeg, jpe, gif, tiff и bmp. Все остальные файлы будут помещены в папку components-assets (имя папки зависит от опции fs.componentsFolderName).\n\nОсновная идея в том, чтобы сделать компонент как можно более изолированной структурой. Здесь можно использовать [BEM](https://ru.bem.info), [веб-компоненты](http://webcomponents.org) (и их [реализация от Google](https://www.polymer-project.org)), что-то еще. Можно все делать и по старинке, внутри одного компонента вся верстка, но это крайне не рекомендуется.\nЕсли говорить терминами BEM, то каждый компонент — это блок.\nЕсть отличная лекция о том, как лучше организовать свой код, [ссылка](https://www.youtube.com/watch?v=pyAYbbDJjPo).\n\nВ `pages` находятся шаблоны страниц, в которые в итоге будут включены компоненты. Страницы являются лэйаутом и должны содержать в себе как можно меньше кода, чтобы структура была как можно более прозрачная.\nЧтобы создать новую страницу, просто скопируйте существующую (или _template) и переименуйте или [используйте tars add-page](https://github.com/tars/tars-cli/blob/master/docs/ru/commands.md#tars-add-page-pagename).\nТакже вы можете добавить компонент с помощью TARS-CLI — [tars add-component](https://github.com/tars/tars-cli/blob/master/docs/ru/commands.md#tars-add-module-modulename).\n\n## Структура папки для статики\n\nБудем считать, что css-препроцессором был выбран Scss.\n\n```\nstatic/                                     # Папка для статики. Название для папки настраивается в tars-config.js\n    ├── fonts/                              # Шрифты (может содержать поддиректории)\n    ├── img/                                # Картинки. Название для папки настраивается в tars-config.js\n        ├── content/                        # Контентные картинки (может содержать поддиректории)\n        ├── plugins/                        # Картинки для плагинов (может содержать поддиректории)\n        ├── general/                        # Общие картинки для проекта (может содержать поддиректории)\n        ├── sprite/                         # Растровые картинки, которые должны быть включены в спрайт (png) \n            ├── 96dpi/                      # Картинки для экранов с dpi 96\n            ...\n            └── 384dpi/                     # Картинки для экранов с dpi 384 (более подробно в разделе работы с изображениями)\n        └── svg/                            # SVG-картинки\n    ├── js/                                 # js\n        ├── framework/                      # js-фреймворки (например, backbone)\n        ├── libraries/                      # js-библиотеки (например, jquery)\n        ├── plugins/                        # js-плагины\n        └── separate-js/                    # js-файлы, которые не должны попасть в итоговый склеенный js-файл.\n    ├── misc/                               # Общие файлы, которые будут перемещены в корень собранного проекта — фавиконка, robots.txt и т.д.  (может содержать поддиректории)\n    └── scss                  \n        ├── entry/                          # Стили, для точек входа при ручном управлении компиляции стилей. Подробнее [тут](css-manual-processing.md).\n        ├── etc/                            # Стили, которые будут подключаться в самом конце (может содержать поддиректории)\n        ├── libraries/                      # Стили библиотек (может содержать поддиректории)\n        ├── plugins/                        # Стили для плагинов (может содержать поддиректории)\n        ├── separate-css/                   # Стили, которые не должны попасть в итоговый склеенный css-файл.\n        ├── sprite-generator-templates/     # Шаблоны, по которым генерируются спрайты\n        ├── sprites-scss/                   # Миксины для спрайтов  \n        ├── common.scss                     # Общие стили для всего проекта\n        ├── fonts.scss                      # Стили для подключенный шрифтов\n        ├── GUI.scss                        # Стили для GUI-элементов типа кнопок, полей ввода и т.д.\n        ├── mixins.scss                     # Набор миксинов\n        ├── normalize.scss                  # Сброс стилей\n        └── vars.scss                       # Переменные проекта\n```\n\n\n## Структура готовой сборки\n\nПосле сборки проекта в корне появятся две папки: dev и builds. Ниже дано описание dev-версии сборки (С включенным режимом --ie8), так как готовый билд не сильно отличается от dev.\n\n```\ndev/\n    └── static/                         # Статика для проекта (имеет имя, заданное в tars-config)\n        └── css/                        # Готовые файлы стилей для всех основных браузеров, IE9 и IE8, если включена их поддержка и стили, которые не вошли в общую сборку.\n        └── components-assets/          # Файлы для компонентов.\n                └── exampleComponent/   \n        └── img/                        # Картинки для проекта\n            └── assets/                 # Файлы для компонентов. Содержит в себе директории с именами тех компонентов, которые имеют доп. файлы (только картинки)\n                └── exampleComponent/      \n            └── content/                # Картинки для контента\n            └── plugins/                # Картинки для плагинов\n            └── svg-sprite/             # SVG-спрайт\n            └── png-sprite/             # PNG-спрайты для разных dpi\n            └── rastered-svg-images/    # Отрастированные svg-картинки для IE8\n            └── minified-svg/           # Минифицированные svg\n        └── js/                         # Итоговый main.js файл и js-файлы, которые не должны попасть в общую сборку.\n            └── separate-js/   \n    └── temp/                           # Папка для данных для компонентов\n    ├── Готовые страницы и файлы из папки misc\n```\n\nbuild-версия проекта не содержит папки temp, включает минимизированные css- и js-файлы. Содержит оптимизированные картинки и архив с собранным проектом (опционально).\n\nЕсли включена опция useBuildVersioning, то каждый билд будет лежать в отдельной папке по пути, который указан в опции [buildPath](options.md#buildpath), под названием build_ver%дата сборки%. Если useBuildVersioning отключен, то готовый проект находится по пути, который указан в опции [buildPath](options.md#buildpath), в папке build.\n\nПри подключении картинок необходимо использовать именно тот путь, по которому они лежат в собранном проекте.\n\nСразу после инициализации или переинициализации в корне могут появиться папки .tmpPreproc и .tmpTemplater, в которых находятся скачанные шаблонизатор и css-препроцессор. При первой же сборке эти папки будут удалены. Так что просто не обращайте на них внимание. Эти папки влючены в .gitignore, так что они точно не попадут в ваш репозиторий.\n\nДанную файловую структуру можно менять, с правкой соответствующих тасков и вотчеров. Для некоторых папок нет необходимости лезть в таски и вотчеры. Например, можно создать папки для хранения js, [который должен быть выполнен до компонентов и после](options.md#jspathstoconcatbeforemodulesjs-и-jspathstoconcataftermodulesjs). Это будет полезно при использовании различных js-фреймворков.\n\nТакже не обязательно пользоваться всеми папками для изображений или js. Если что-то не нужно, это можно удалить.\n"
  },
  {
    "path": "docs/ru/fonts-and-misc.md",
    "content": "<p align=\"right\">\n<a href=\"../en/fonts-and-misc.md\">English description</a> | Описание на русском\n</p>\n\n# Работы со шрифтами и misc-файлами\n\nВсе шрифты размещаются в папке fonts в папке со статикой для проекта.\n\nВ папке misc можно хранить любые дополнительные файлы проекта, например фавиконку и т.п. Все файлы отсюда буду скопированы в корень скомпилированного проекта. Поддерживается вложенность директорий. При копировании файлов иерархия папок будет сохранена.\n"
  },
  {
    "path": "docs/ru/for-contributors.md",
    "content": "# Руководство для контрибьютеров\n\n## Code style\n\nЗа основу берем [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript). На русском [uprock/javascript](https://github.com/uprock/javascript).\n\nЕсть небольшие отличия в code style Airbnb от того, как нужно писать JavaScript в TARS:\n\n1. **Пробелы и табуляция** Для отступов и табуляции используем 4 пробела, а не 2:\n\n    ```javascript\n    function () {\n    ∙∙∙∙const name;\n    }\n    ```\n\n2. **Длина строки (line length).** Требования длины строки в 80 символов следует считать опциональным. Т.е. строки не должны быть слишком длинными, и должны помещаться в окно редактора даже на небольшом мониторе.\n3. **Комментарии.** Ко всем неочевидным с первого взгляда кускам кода пишем комментарии. Обязательно !осмысленные! и на английском языке. Все комментарии будут модерироваться, поэтому стараемся писать на хорошем английском.\n4. **Строгое равенство/не равенство (=== / !==)** Исходим из здравого смысла и пользуемся только там, где это действительно необходимо. Например в случаях с `null` или `undefined`.\n5. Используем стрелочные функции по-максимуму.\n6. Используем const для всего, что не будем менять. let — для переменных внутри блока (циклы), var — функциональная видимость переменной.\n\nЧтобы проверить, все ли учтено в вашем коде, прогоните его через eslint с настройками, которые лежат в корне TARS.\n\n## Правила работы с ветками, issue и т.д.\n\nВы можете создать Pull request как в мастер, так и в отдельную ветку.\n\n### Реквест в мастер\n\nВ данном случае необходимо, чтобы код соответсвовал code-style, в нем не было ошибок и он не менял функциональность TARS — не добавлял и не убирал. Если предполагается изменение функциональности, то реквест необходимо делать в ветку с текущей разрабатываемой версией.\n\nНеобходимо добавить описание к реквесту, желательно на английском языке. Если есть проблемы с англйиским, то пишем описание на русском.\n\n### Реквест в ветку или реквест ветки\n\nВетка должна иметь вменяемое имя, в котором кратко будет описано, о чем эта ветка. Запрещается название веток на русском языке.\n\nЕсли ваша правка относится к какой-либо версии, то название ветки должно начинаться так: version-\\*.\\*.\\*-add-something. Звездочки — конкретная версия, к которой относится реквест. Например, version-1.3.0-add-sourcemaps.\n\n### Работа с issue\n\nЕсли вы хотите выполнить какой-либо issue, важно получить одобрение на его выполнение от @artem-malko.\n\nЧтобы оставить заявку, достаточно написать в комментарии к задаче: `I'll make it`. После этого нужно получить от меня большой палец (смайл в виде большого пальца поднятого вверх) и на задаче должен появиться лэйбл `in progress`. После этого можно брать задачу в работу. Задачу необходимо выполнять в отдельной ветке, которая образована от ветки текущей разрабатываемой версии, например от version-1.3.0. О том, как создавать реквест в ветку рассказано выше.\n\nДополнительные контрибуторы не допускаются, если на задаче есть лейбл `in progress`.\n\nЕсли ваша задача перекликается по функциональности с другой, важно договориться об этом с исполнителем конфликтующей задачи, как вы будете в дальнейшем работать над конфликтующими участками кода.\n\nБрать в работу можно только ту задачу, у которой есть хотя бы 1 лэйбл (кроме лейбла backlog) и она имеет какую-либо версию. Задачи без версии в работу не беруться, однако тут можно обсудить отдельно, возможно, задача может попасть в какой-либо ближайший релиз, если вы готовы ее выполнить.\n\n### Создание pull-реквестов\n\nПосле того, как вы закончили работу над какой-либо задачей, необходимо создать pull request в мастер или в ветку. В реквесте необходимо кратко описать, что было сделано, на что стоит обратить внимение. Также нужно указать ссылку на задачу, которую реквест решает.\n\nВсе реквесты должны пройти аппрув от @artem-malko и тесты в travis и appveyor. Аппрув — 1 большой палец от @artem-malko. Если задачу сделал @artem-malko, то необходим палец любого другого разработчика.\n\nВнимание! Сливать свой реквест можно только после аппрува @artem-malko.\n\nПосле того, как реквест слит, необходимо удалить ветку, в которой велась работа.\n"
  },
  {
    "path": "docs/ru/handlebars-helpers.md",
    "content": "<p align=\"right\">\n<a href=\"../en/handlebars-helpers.md\">English description</a> | Описание на русском\n</p>\n\n# Handlebars-helpers\n\nВ TARS есть несколько полезных встроенных хелперов. Также есть возможность добавлять свои хелперы в файл /tars/user-tasks/html/helpers/handlebars-helpers. Вам не нужно регистрировать новый хелпер, необходимо его только объявить как поле объекта «handlebarsHelpers», как функцию. Все кастомные хелперы будут автоматически доступны в шаблонах. Кроме того, все эти хелперы будут автоматически перенесены при обновлении проекта с помощью TARS-CLI.\n\nПоговорим о встроенных хелперах.\n\n## repeat\n\nИспользуется для создания простого цикла от 0 до n ([цикл для обхода массива данных есть в handlebars по-умолчанию](http://handlebarsjs.com/builtin_helpers.html)).\n\nСинтаксис:\n\n```handlebars\n{{#repeat n}}\n    Do something\n{{/repeat}}\n```\n\nn — количество повторений. Number, целое.\n\n\n## is\n\nИспользуется для расширения стандартного if. Встроенный if умеет проверять только существует значение или нет. #is позволяет использовать стандартное поведение if. Операция сравнения передается в виде строки вторым аргументом. 1 и 3 передаются значения для сравнения. Доступны следующие операции (все операции выполняются в JavaScript, соответственно и результат сравнения получается таким же, как если бы это был if внутри JavaScript):\n\n* `==` нестрогое равно;\n* `===` строгое равно;\n* `>` строго больше;\n* `>=` больше или равно;\n* `<` строго меньше;\n* `<=` меньше или равно;\n* `!=` нестрогое неравенство;\n* `!==` строгое неравенство.\n\ntest — переменная, переданная в шаблон\n\n```js\ntestComponent: {\n    test: 10\n}\n```\n\nСинтаксис:\n\n```handlebars\n{{#is test '>' 9}}\n    true\n{{else}}\n    false\n{{/is}}\n```\n\n\n## strip\n\nВырезает все пробелы из переданного контента.\n\nСинтаксис:\n\n```handlebars\n<style>\n    ul li {\n        display: inline-block;\n    }\n</style>\n\n{{#strip}}\n    <ul>\n        <li>qwe</li>\n        <li>asd</li>\n    </ul>\n{{/strip}}\n```\n\nРезультат:\n\n```html\n<ul><li>qwe</li><li>asd</li></ul>\n```\n\n\n## toLowerCase\n\nПеревод переданной строки в нижний регистр.\n\nСинтаксис:\n\n```handlebars\n{{toLowerCase 'string'}}\n```\n\n\n## toUpperCase\n\nПеревод переданной строки в верхний регистр.\n\nСинтаксис:\n\n```handlebars\n{{toUpperCase 'string'}}\n```\n\n\n## capitalizeFirst\n\nПеревод первого символа переданной строки в верхний регистр.\n\nСинтаксис:\n\n```handlebars\n{{capitalizeFirst 'string'}}\n```\n\n## formatDate, now, i18n\n\nДополнительные хелперы. Документация по ним досутпна в репозитории проекта https://github.com/assemble/handlebars-helpers\n\n"
  },
  {
    "path": "docs/ru/html-processing.md",
    "content": "<p align=\"right\">\n<a href=\"../en/html-processing.md\">English description</a> | Описание на русском\n</p>\n\n# HTML\n\nВ качестве шаблонизатора для HTML можно использовать [Jade](http://jade-lang.com), [Pug](https://pugjs.org/api/getting-started.html) или [Handlebars](http://handlebarsjs.com). Шаблонизатор выбирается в [tars-config.js](options.md#templater) или во время [инициализации TARS с помощью TARS-CLI](https://github.com/tars/tars-cli/blob/master/docs/ru/commands.md#tars-init).\n\nМожно использовать любые средства данных шаблонизаторов. Если вы привыкли к ламповому HTML, то смело выбирайте Handlebars и просто пишите HTML как раньше.\n\nЕсли не требуется компиляция определенной страницы, то можно просто добавить '_' в начало названия страницы, и она не будет скомпилирована.\n\nЕсли необходимо подключить файлы из директории static (картинки, js-файлы), то необходимо пользоваться плейсхолдером [%=static=% или \\_\\_static\\_\\_](options.md#staticprefix). Тогда подключение картинки в контенте будет выглядеть следующим образом (в примере используется Handlebars):\n\n```html\n<img src=\"%=static=%img/content/example.jpg\"/>\n```\n\nДля подключения картинки в CSS необходимо использовать тот же плейсхолдер – %=static=% или \\_\\_static\\_\\_. Данный плейсхолдер в CSS подставит значение из конфига [staticprefixforcss](options.md#staticprefixforcss).\n\n**Префиксы %=staticPrefixForCss=% и %=staticPrefix=% все еще работают, но крайне не желательно его использовать, так как в будущих версиях он будет удален! Используйте просто %=static=% или \\_\\_static\\_\\_! Новый вариант префиксов работает в TARS начиная с версии 1.6.0**\n\nОчень важной фичей является использование различных данных в одном шаблоне. Например, у нас есть компонент head, в котором находится все, что стоит поместить в тег head (различные meta, тайтлы и т.д.) Предположим, что на каждой  странице должен быть свой title. Создавать копии одного и того же компонента, которые отличаются только одной строчкой — не целесообразно. Было бы логично отделить данные от представления.\n\nПоэтому в папке с компонентом есть папка `data`, в которой находится js-файл с данными данного компонента.\n\nПример данных можно найти в компоненте _template:\n\n```javascript\ncomponentName: {\n    dataType: {\n        property: value\n    }\n}\n```\n\nЕсли у вас IDE ругается на синтаксис, то можно использовать обычный JavaScript-объект:\n\n```javascript\ndata = {\n    componentName: {\n        dataType: {\n            property: value\n        }\n    }\n};\n```\n\nОба синтаксиса поддерживаются TARS по умолчанию.\n\nВ файле data.js поддерживаются комментарии только внутри объекта с данными.\n\nС версии TARS 1.8.0 появилась возможность использовать вложенные компоненты. Может получиться такая ситуация, что вложенные компоненты в двух разных компонентах могут иметь одно название и одинаковый ключ в данных. Чтобы такого не происходило TARS генерирует уникальный ключ для вложенных компонентов следующим образом:\n\n```javascript\n'parentComponentName_anotherParentComponent_currentComponentName' = {\n    dataType: {\n        property: value\n    }\n};\n```\n\nПри этом в самом вложеном компоненте вы пишете также, как и обычно:\n\n```javascript\nconst data = {\n    'currentComponentName': {\n        dataType: {\n            property: value\n        }\n    }\n};\n```\n\nВсе преобразования ключа происходят автоматически.\n\nПо умолчанию в данных будут находится данные из компонента _template и список всех страниц проекта в виде:\n\n```javascript\n__pages: [\n    {\n        name: 'pageName',\n        href: 'pageHref'\n    }\n]\n```\n\nЭтот массив можно использовать для генерации списка ссылок всех страниц проекта.\n\nТакже, в шаблон можно передать любые данные с помощью переменной окружения TARS_ENV. Например так можно передать простую строку:\n\n```bash\nTARS_ENV=\"Hello World\" tars dev --silent\n```\n\nЗатем в шаблоне (handlebars):\n\n```handlebars\n{{TARS_ENV}}\n```\n\nТакже можно передавать объекты:\n\n```bash\nTARS_ENV=\"{\\\"name\\\": \\\"Paul\\\"}\" tars dev --silent\n```\n\nЗатем в шаблоне (handlebars):\n\n```handlebars\n{{TARS_ENV.name}}\n```\n\n**Обратите внимание, при передаче объекта в переменную окружения необходимо указывать двойные кавычки, а также экранировать их!**\n\n\nПодключение компонентов с различными данными выглядит по-разному в Jade/Pug и Handlebars.\n\n\n##Работа с компонентами и данными в Handlebars\n\nПодключение компонента на странице:\n\n```handlebars\n{{> componentFolderName/componentName}}\n```\n\nПодключение компонента с передачей данных в шаблон:\n\n```handlebars\n{{> componentFolderName/componentName componentName.dataType}}\n```\n\nПример подключения компонента head с данными типа defaults:\n\n```handlebars\n{{> head/head head.defaults}}\n```\n\nВнутри самого компонента данные выводятся средствами Handlebars:\n\n```handlebars\n<title>{{title}}</title>\n```\n\nЕсли вы не передали данные в компонент, то компонент получает доступ в глобальный контекст. Иными словами, если мы подключим компонент head без передачи данных, то в самом шаблоне мы можем получить доступ к полю title следующим образом:\n\n```javascript\n// head/data/data.js\nhead: {\n    defaults: {\n        title: 'Default title'\n    }\n}\n```\n\nindex.html\n```handlebars\n{{> head/head}}\n```\n\nhead.html\n```handlebars\n<title>{{head.defaults.title}}</title>\n```\n\nЕсли же вы передали контекст с подключением компонента, то доступ к данным других компонентов вы уже не имеете внутри подключенного. Чтобы подключать компоненты внутри других компонентов со своими данными необходимо в компонент-родитель передавать глобальный контекст (не передавать никаких данных при подключении). Тогда вы сможете передать в любой дочерный компонент необходимые данные. Либо можно воспользоваться следующим способом:\n\nindex.html\n```handlebars\n{{> component1/component1 component1.main}}\n```\n\ncomponent1.html\n```handlebars\n\n<h1>{{title}}</h1>\n\n{{> component2/component2 component2.main}}\n```\n\n```javascript\n// component1/data/data.js\ncomponent1: {\n    main: {\n        title: 'Title of component1',\n        component2: function (fullData) {\n            return fullData.component2;\n        }\n    }\n}\n```\n\ncomponent2.html\n```handlebars\n\n<h2>{{title}}</h2>\n```\n\n```javascript\n// component2/data/data.js\ncomponent2: {\n    main: {\n        title: 'Title of component2'\n    }\n}\n```\n\nТаким образом, вы можете получить доступ к данным любого компонента из данных любого компонента простой конструкцией:\n\n```javascript\n// component/data/data.js\ncomponent: {\n    main: {\n        title: 'Title of component',\n        innerComponentData: function (fullData) {\n            // fullData — объект, который содержит все данные проекта\n            return fullData.componentName.componentType;\n        }\n    }\n}\n```\n\nА если использовать стрелочные функции ES6, то все становится еще проще:\n\n```javascript\n// component/data/data.js\ncomponent: {\n    main: {\n        title: 'Title of component',\n        innerComponentData: fullData => fullData.componentName.componentType\n        }\n    }\n}\n```\n\nНе забудьте, ключ доступа к данным вложенных компонентов будет сгенерирвоан автоматически на основе вложенности в другие компоненты.\n\nHandlebars известен, как очень простой шаблонизатор. Но использовать его в статической верстке в таком виде не очень удобно. Поэтому были добавлены различные хелперы, расширяющие возможности Handlebars.<br/>\nОписание хелперов можно прочесть [здесь](handlebars-helpers.md).\n\n\n## Работа с компонентами и данными в Jade/Pug\n\nПри использовании Jade/Pug, каждый компонент — миксин, который подключается в файл страницы. Миксины могут принимать данные, этим и воспользуемся.\n\nПодключение компонента на странице:\n\n```jade\ninclude ../components/componentFolderName/componentName  // В начале шаблона страницы (пример — index.jade|pug)\n\n+componentName()  // Подключение компонента\n```\n\nПодключение компонента с передачей данных в шаблон:\n\n```jade\ninclude ../components/componentFolderName/componentName  // В начале шаблона страницы (пример — index.jade|pug)\n\n+componentName(componentName.dataType)  // Подключение компонента\n```\n\nПример подключения компонента head с дефолтными данными:\n\n```jade\ninclude ../components/head/head\n+head(head.defaults)\n```\n\nВ случае использования Pug, вам необходимо указать расширение для подключаемого компонента:\n\n```jade\ninclude ../components/head/head.pug\n+head(head.defaults)\n```\n\nВнутри самого компонента данные выводятся средствами Jade/Pug (например, компонент head):\n\n```jade\nmixin head(data)\n    <title>#{data.title}</title>\n```\n\nМожно использовать любые средства, доступные в Jade/Pug. Вы можете подключать компоненты с любой сложностью, с любыми данными. Функции в data.js также доступны, как и в примерах для Handlebars.\n\nВ TARS есть один встроенный хелпер для Jade/Pug — хелпер `Icon`, который вставляет шаблон для подключения svg-symbol в HTML. Также есть возможность добавлять свои хелперы в файл /tars/user-tasks/html/helpers/jade|pug-helpers. Там же есть пример объявления хелпера. Все хелперы доступны в шаблонах следующим образом:\n\nДля Jade:\n```jade\n= jadeHelpers.helperName(params)\n\n<!-- Если необходимо вывести не заэскпейпленный HTML -->\n!= jadeHelpers.helperName(params)\n```\n\nДля Pug:\n```jade\n= pugHelpers.helperName(params)\n\n<!-- Если необходимо вывести не заэскпейпленный HTML -->\n!= pugHelpers.helperName(params)\n```\n"
  },
  {
    "path": "docs/ru/images-processing.md",
    "content": "<p align=\"right\">\n<a href=\"../en/images-processing.md\">English description</a> | Описание на русском\n</p>\n\n# Images\n\nВсю работу с изображениями в TARS можно разбить на две части: «Спрайты» и «Отдельные изображения».\n\n## Спрайты\n\nTARS поддерживает работу с двумя форматами изображений для спрайта: PNG и SVG.\n\n**TARS поддерживает несколько способов работы с SVG-графикой. Более подробно можно прочитать в [документации по работе с SVG](./svg-processing.md)**\n\nОбщий подход отлично описан в [презентации](http://www.slideshare.net/codefest/codefest-2014-2) веб-разработчика [Тимофея Чаптыкова](https://github.com/Chaptykov). Кратко подход описан ниже. Преимущество данного подхода раскрыто в презентации и не будет объяснено ниже.\n\nЗдесь не будут описаны преимущества склейки интерфейсных (и других мелких или частоповторяющихся изображений) в единый спрайт. Если вы не знакомы с понятием спрайт — подробности [по ссылке](https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D1%80%D0%B0%D0%B9%D1%82_(%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%BA%D0%B0)).\n\nВы можете пропустить теорию и сразу [перейти к описанию работы со спрайтами](images-processing.md#%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D0%BF%D1%80%D0%B0%D0%B9%D1%82%D0%BE%D0%B2).\n\nСегодня существует много экранов с высокой плотностью пикселей. Разберёмся, что это значит. В качестве примера рассмотрим смартфоны IPhone 3GS и IPhone 4. У 3GS разрешение экрана 320x480, а у 4-ки — 640x960. Как мы видим, разрешение увеличилось ровно в два раза при той же диагонали, а значит пиксель стал меньше. Чтобы нивелировать эту разницу между размерами пикселей (а ведь именно пикселями мы управляем в CSS) появился параметр device-pixel-ratio (или dppx), который показывает, сколько реальных экранных пикселей содержится в неком логическом пикселе, которым мы оперируем в CSS. Например, для дисплея IPhone 4 этот параметр равен 2.\n\nБолее подробно можно прочесть [здесь](http://stackoverflow.com/questions/21971331/what-is-dots-per-css-inch-and-dots-per-physical-inch) и [здесь](http://www.w3.org/TR/css3-values/#absolute-lengths).\n\nПредположим у нас есть спрайт PNG-изображений. Такие картинки имеют фиксированные размеры. Если мы будем размазывать такую картинку на количество пикселей в 3 раза большее, чем размеры картинки, то изображение будет размыто.\n\nЧтобы избавиться от этой проблемы, можно использовать изображение в 3 раза большего размера для подобного экрана, при этом размер картинки в CSS задавать исходя из размера оригинального изображения (свойство background-size).\n\nНа данный момент существуют экраны с dppx от 1 до 4 (скоро будут и выше). Готовить спрайты для 4 размеров экранов — это очень много работы.\n\nВыручает SVG. Векторный, не зависит от dppx экрана, отлично рендерится в современных (и не только) браузерах. Можно сделать только 1 размер и это изображение будет выглядеть одинаково на всех экранах.\n\nК сожалению SVG имеет несколько недостатков:\n\n* SVG плохо отображает радиальные и другие сложные градиенты (линейные отображаются отлично).\n* Плохо отображаются сложные тени.\n* Не отображается в IE8.\n\nИтого имеем два подхода: SVG для всего, чего можем. Для остального готовим PNG-изображения для тех экранов, которые вы собираетесь поддерживать. Для IE8 будем просто растрировать SVG-изображения.\n\n**TARS поддерживает несколько способов работы с SVG-графикой. Более подробно можно прочитать в [документации по работе с SVG](svg-processing.md)**\n\n## Подключение растровых спрайтов\n\nИзображения, которые не могут быть отрисованы в SVG складываются в 'static/img/sprite/96dpi|192dpi|288dpi|384dpi'. В папку 96dpi кладутся изображения для экранов с dppx = 1, в папку 192dpi кладутся изображения в два раза больше оригинала, с названиями оригиналов. Данные изображения будут подключаться на экранах с dppx = 2. Далее по аналогии.\n\nИспользуемые экраны настраивается [в конфиге проекта](options.md#useimagesfordisplaywithdpi).\n\nПодключение иконки из растрового спрайта в CSS-коде производится с помощью миксина (пример на SCSS, названия миксинов и входные параметры для других CSS-препроцессоров такие же):\n\n```scss\n@include bg($png-image-name);         // Подключение спрайта с png-картинками\n```\n\nОбратите внимание, в миксин передается **переменная** с именем исходной картинки (без расширения).\n\nМиксин `bg` включит в CSS background, размер картинки, backgroud-size и задаст позиционирование внутри png-спрайта. Больше ничего добавлять не нужно, миксин сам задаст медиа-выражения для экранов с различной плотностью пикселей.\n\n## Отдельные изображения\n\nРабота с отдельными изображениями очень проста. Отдельные изображения разделены на несколько категорий. В зависимости от категории картинки кладутся в разные места.\n\nСборщик поддерживает изображения любого типа, но только SVG, PNG, JPG будут подвергаться минификации.\n\n!Все описанное ниже является лишь рекомендацией, вы можете организовать хранение картинок так, как вам удобно!\n\n\n### Картинки компонента\n\nНаходятся в папке assets внутри компонента. Для подключения используется следующий шаблон (для подключения картинки в HTML, необходимо использовать плейсхолдер [%=static=% или \\_\\_static\\_\\_](options.md#staticprefixforcss)):\n\n```css\n.componentName {\n    background: url('%=static=%assets/componentName/sample-image-name.png') no-repeat;\n}\n```\n\nВ HTML подключение выглядит чуть иначе, но используется тот же плейсхолдер [%=static=% или \\_\\_static\\_\\_](options.md#staticprefix):\n\n```handlebars\n<div class=\"news__item\">\n    <img src=\"%=static=%img/assets/componentName/sample-image-name.png\" alt=\"\">\n</div>\n```\n\n**Префикс %=staticPrefixForCss=% все еще работает, но крайне не желательно его использовать, так как в будущих версиях он будет удален! Используйте просто %=static=% или \\_\\_static\\_\\_! Новый вариант префиксов работает в TARS начиная с версии 1.6.0**\n\nВ картинки компонента стоит складывать только те картинки, которые больше нигде не встречаются. Вложенность директорий поддерживается.\n\n\n### Картинки для контента\n\nНаходятся по пути (указан путь по умолчанию): 'static/img/content/'. В данную папку стоит класть картинки которые встречаются в контентных областях на сайте, например, на странице новости. Вложенность директорий поддерживается.\n\nПодключение картинки внутри HTML:\n\n```handlebars\n<div class=\"news__item\">\n    <img src=\"%=static=%img/content/sample-image-name.jpg\" alt=\"\">\n</div>\n```\n\n**Префикс %=staticPrefix=% все еще работает, но крайне не желательно его использовать, так как в будущих версиях он будет удален! Используйте просто %=static=% или \\_\\_static\\_\\_!**\n\n### Картинки для плагинов\n\nНаходятся по пути (указан путь по умолчанию): 'static/img/plugins/'. В данную папку стоит класть картинки которые используются в различных плагинах. Вложенность директорий поддерживается.\n\n\n### Общие картинки\n\nНаходятся по пути (указан путь по умолчанию): 'static/img/general/'. В данную папку стоит класть картинки которые используются по всему проекту, например общий фон сайта. Вложенность директорий поддерживается.\n"
  },
  {
    "path": "docs/ru/js-concat-processing.md",
    "content": "<p align=\"right\">\n<a href=\"../en/js-concat-processing.md\">English description</a> | Описание на русском\n</p>\n\n# Работа с JS с помощью простой склейки\n\nДанный workflow стоит использовать, если у вас простое приложение и нет надобности разрешать зависимости между файлами. При выборе данного подхода все JavaScript-файлы склеиваются в один общий файл в определенном порядке. Порядок и правила склейки описаны ниже.\n\nПо умолчанию JavaScript находится в 2-ух местах:\n\n* В папке со статикой, в подпапке с именем js\n* В каждом отдельном компоненте.\n\nМожно добавить свои папки для js, используя соответствующую [опцию](options.md#jspathstoconcatbeforemodulesjs-%D0%B8-jspathstoconcataftermodulesjs) в конфиге сборщика.\n\nВесь JavaScript-код собирается в один отдельный файл, кроме JavaScript-файлов, которые находятся в директории separate-js. Эти файлы просто переносятся как есть в готовую сборку. Примером такого файла является html5shiv.js\n\nФайлы собираются в следующем порядке:\n\n* static/js/framework (включая подпапки)\n* static/js/libraries (включая подпапки)\n* static/js/plugins (включая подпапки)\n* все файлы, пути к которым находятся в опции jsPathsToConcatBeforeModulesJs\n* JavaScript-файлы компонентов\n* все файлы, пути к которым находятся в опции jsPathsToConcatAfterModulesJs\n\n**Файлы с _ в начале файла не будут попадать в общую сборку и не буду проверены линтером.**\n\nПроверкой файлов из jsPathsToConcatBeforeModulesJs и jsPathsToConcatAfterModulesJs можно управлять отдельно, опциями lintJsCodeBeforeModules и lintJsCodeAfterModules.\n"
  },
  {
    "path": "docs/ru/js-processing.md",
    "content": "<p align=\"right\">\n<a href=\"../en/js-processing.md\">English description</a> | Описание на русском\n</p>\n\n# Работа с JS\n\nВ TARS поддерживается два подхода в работе с JavaScript-кодом:\n\n* [склеивание всех JavaScript-файлов в один в определенном порядке](js-concat-processing.md);\n* [использование webpack, для разрешения зависимостей между файлами (доступно с версии 1.7.0)](js-webpack-processing.md).\n\nВ обоих подходах поддерживается проверка кода с помощью eslint. Конфигурация eslint находится в корне проекта: .eslintrc и .eslintignore. Управлять проверкой кода можно с помощью опции [js.lint в конфиге проекта](options.md#lint).\n\nТакже в обоих подходах есть возможность обработки JavaScript-кода с помощью [Babel](https://babeljs.io/). Для подключения Babel нужно использовать опцию [useBabel](options.md#usebabel) (по умолчанию выключено). Если вам необходимо исключить какие-либо файлы из обработки Babel, то вы можете добавить в начало названия этих файлов \"babel_ignore_\" или добавить их в секцию ignore в .babelrc в корне проекта. Все JavaScript-файлы из папок static/framework, static/libraries, static/plugins и static/separate-js находятся в ignore в .babelrc по умолчанию. С остальными опциями конфига Babel можно ознакомится на [официальном сайте](https://babeljs.io/docs/usage/options/). Вам не нужно использовать опции: 'filename', и все оцпии, связанные с sourcemaps. Эти опции уже заданы в самом сборщике.\n\nSourcemaps вы можете управлять через опцию в [конфиге сборщика](options.md#sourcemaps).\n"
  },
  {
    "path": "docs/ru/js-webpack-processing.md",
    "content": "<p align=\"right\">\n<a href=\"../en/js-webpack-processing.md\">English description</a> | Описание на русском\n</p>\n\n# Работа с JS через webpack\n\n**Есть большая просьба: все вопросы по настройке/работе с webpack адресовать в Google, Stack Overflow и т.д.**\n\nДля ознакомления с webpack рекомендую изучить [скринкаст Ильи Кантора](https://www.youtube.com/playlist?list=PLDyvV36pndZHfBThhg4Z0822EEG9VGenn) и [документацию по webpack](http://webpack.github.io/docs/). Скринкаст раскрывает множество особенностей при работе с webpack и его грамотной настройке.\n\nВ TARS webpack уже настроен для того, чтобы с ним было достаточно комфортно работать. Но вы можете (и скорее всего вам придется это делать) изменять webpack-конфиг (файл webpack.config.js в корне проекта), чтобы webpack выполнял именно то, что вам нужно.\n\nПо умолчанию используется только одна точка входа: markup/static/js/main.js. Вы можете использовать другой файл и сколь угодоно большое количество точек входа. **Необходимо использовать функцию prepareEntryPoints, в которую будет передаваться объект с информацией о точках входа. Это необходимо для корректной работы Hot Module Replacement!**\n\nПо умолчанию webpack умеет разрешать зависмости, объявленные через require (import/export, если включена обработка кода через babel). При этом, в любой точке приложения вы можете подключить файл компонента с помощью алиаса «components». Предположим, что мы находимся в markup/static/js/main.js и хотим подключить в нем скрипт из компонента «example». Вместо указания относительного пути от main.js до example.js можно написать так:\n\n```js\nimport foo from 'components/example/example'; // useBabel: true\n// или\nconst foo = require('components/example/example');\n\n// Доступен и прошлый вариант\nconst foo = require('modules/example/example');\n```\n\nТакже есть алиас для папки static, который позволит подключить файл из папки static в любой точке приложения:\n\n```js\nimport $ from 'static/js/jquery/jquery'; // useBabel: true\n// или\nconst $ = require('static/js/jquery/jquery');\n```\n\nДля подключения библиотек из node_modules достаточно указать имя пакета:\n\n```js\nimport $ from 'jquery';  // useBabel: true\n// или\nconst $ = require('jquery');\n```\n\nВ webpack уже настроены sourcemaps, которыми вы можете [управлять из конфига проекта](options.md#sourcemaps). Sourcemaps сторонних плагинов и библиотек будут добавлены к обещму sourcemap (реализовано с помощью source-map-loader). Сжатие производится с помощью плагина uglifyJS.\n\nПо умолчанию у вас есть возможность использовать переменную окружения NODE_ENV в коде. Подробнее можно узнать в [этом ролике Ильи Кантора](https://www.youtube.com/watch?v=5XZqeuWkQ4o&index=6&list=PLDyvV36pndZHfBThhg4Z0822EEG9VGenn). Используется плагин webpack.DefinePlugin.\n\nВотчинг за изменениями JavaScript-файлов также лежит на плечах webpack.\n\nТакже доступна горячая замена компонентов ([Hot module replacement](https://webpack.github.io/docs/hot-module-replacement.html)). На русском можно прочитать об этом на [habr'е](https://habrahabr.ru/company/Voximplant/blog/270593/) и посмотреть [ролики из скринкаста Ильи Кантора](https://www.youtube.com/watch?v=EQhXtTOxpVk&list=PLDyvV36pndZHfBThhg4Z0822EEG9VGenn&index=40). Данная возможность [опциональна](options.md#usehmr), реализована с помощью middleware для Browser-sync и плагина webpack.HotModuleReplacementPlugin.\n\nПо умолчанию встроена поддежка babel (babel-loader) и eslint (eslint-loader), которые работают через webpack. Eslint использует встроенный парсер для разбора JavaScript-кода, но если вам необходимо поддерживать совсем новые фичи (экспериментальные), вам придется использовать парсер babel-eslint. Подробности можно прочесть в [репозитории проекта](https://github.com/babel/babel-eslint) и [документации eslint](http://eslint.org/docs/user-guide/configuring#specifying-parser-options).\n\n"
  },
  {
    "path": "docs/ru/options.md",
    "content": "<p align=\"right\">\n<a href=\"../en/options.md\">English description</a> | Описание на русском\n</p>\n\n# Опции\n\nВся конфигураци сборщика находится в одном файле — tars-config.js в корне проекта.\n\nНужно перезапустить сборку, чтобы изменения применились.\n\n\n## Изменяемые опции\n\n### postcss\n\nType: `Array`\n\nDefault: `[]`\n\nExample: \n````javascript\npostcss: [\n        {\n            name: 'postcss-short',\n            options: {\n                deny: ['text']\n            }\n        }, {\n            name: 'postcss-size',\n            options: {}\n        }\n    ]\n````\n\nЗдесь можно перечислить используемые постпроцессоры. Обязательно выполните установку используемых постпроцессоров.\n\n### svg\n\nType: `Object`\n\nКонфиг для работы с svg-графикой в TARS.\n\n#### active\n\nType: `Boolean`\n\nDefault: `true`\n\nВключение поддержки svg в проекте.\n\n#### workflow\n\nType: `String`\n\nDefault: `sprite`\n\nСпособ работы с svg-графикой. Доступны SVG-спрайт и SVG-symbols. \nПоддерживаются значения `sprite` для использования SVG-спрайтов и `symbols` для svg-symbols.\n\n**При выборе \"symbols\", сборка для IE8 недоступна**\n\n#### symbolsConfig\n\nType: `Object`\n\nОписывает конфиг для работы с svg-symbols.\n\n##### loadingType\n\nType: `String`\n\nDefault: `inject`\n\nУстанавливает способ подключения svg-symbols на странице.\n\nПоддерживаются значения:\n* `inject` — инжект в тело HTML;\n* `separate-file` — хранение в отдельном файле;\n* `separate-file-with-link` — хранение в отдельном файле, при этом каждая иконка подключается из этого файла.\n\n##### usePolyfillForExternalSymbols\n\nType: `Boolean`\n\nDefault: `true`\n\nХранение в отдельном файле нативно поддерживается во всех современных браузерах, кроме IE9 - Edge. Для них используется полифл. Если вы не поддерживаете эти браузеры, то можете выставить false.\n\n##### pathToExternalSymbolsFile\n\nType: `String`\n\nDefault: `''`\n\nВы можете задать путь, по которому файл с svg-symbols будет находится в проекте. По умолчанию файл создается в корне готовой сборки.\n\nПример значения: `static/images/`.\n\n### css\n\nType: `Object`\n\nКонфиг для работы с CSS в TARS. Доступен с версии TARS 1.8.0.\n\n#### workflow\n\nType: `String`\n\nDefault: `concat`\n\nСпособ обработки CSS-кода.\n\nДоступны:\n* `concat` — конкатенация CSS-файлов в один в определенном порядке;\n* `manual` — использование точек входа (основных файлов), в которые импортируются файлы стилей проекта.\n\n### js\n\nType: `Object`\n\nКонфиг для работы с JavaScript в TARS. Доступен с версии TARS 1.7.0.\n\n#### workflow\n\nType: `String`\n\nDefault: `concat`\n\nСпособ обработки JavaScript-кода.\n\nДоступны:\n* `concat` — конкатенация JavaScript-файлов в один в определенном порядке;\n* `modular` — использование бандлера, который будет разрешать зависимости между JavaScript-файлами.\n\n#### bundler\n\nType: `String`\n\nDefault: `webpack`\n\nВ bundler можно указать используемый сборщик JavaScript-кода, если в качестве workflow был выбран `modular`.\n\nПока что доступен только `webpack`.\n\n#### lint\n\nType: `Boolean`\n\nDefault: `true`\n\nВключение проверки ошибок в JavaScript-коде и code-style (опции для eslint находятся в корне, в файле `.eslintrc`. Весь список доступных опций можно найти [тут](http://eslint.org/)). Также, вы можете точечно отключить линтинг файлов используя `.eslintignore` в корне проекта. \n\n#### useBabel\n\nType: `Boolean`\n\nDefault: `false`\n\nДанная опция позволяет использовать [Babel](https://babeljs.io/) для поддержки ES6(ES7) синтаксиса. Конфиг для babel находит в корне проекта, в файле `.babelrc`. С доступными опциями .babelc можно ознакомится на [официальном сайте](https://babeljs.io/docs/usage/options/). Вам не нужно задавать опции 'filename' и все что связанно с 'sourcemaps', так как эти оцпии уже заданы в сборщике.\n\n#### webpack\n\nType: `Object`\n\nЗдесь можно управлять подключением особенных фич для webpack.\n\n##### useHMR\n\nType: `Boolean`\n\nDefault: `false`\n\nВключение технологии горячей замены компонентов ([Hot module replacement](https://webpack.github.io/docs/hot-module-replacement.html)).\n\n##### providePlugin\n\nType: `Object`\n\nDefault: `{}`\n\nПараметры для [Provide Plugin](https://webpack.github.io/docs/list-of-plugins.html#provideplugin). Автоматически загружаемые модули.\n\n#### removeConsoleLog\n\nType: `Boolean`\n\nDefault: `true`\n\nУдаление console.log, alert и debugger из JavaScript-файлов в сборке. Является опцией, так как иногда требуется оставить console.log в готовой сборке.\n\n#### jsPathsToConcatBeforeModulesJs и jsPathsToConcatAfterModulesJs\n\nType: `Array of Strings`\n\nDefault: `[]`\n\nДанная опция имеет смысл только при выборе concat в качестве workflow. В этом случае весь JavaScript-код проекта собирается в 1 файл, кроме javascript-файлов, которые находятся в директории separate-js. Если необходимо включить в сборку файлы из других мест (например, вы создали отдельную директорию для JavaScript-файлов), то можно прописать в эту опцию путь или массив путей (паттернов путей, типа controllers/\\*\\*/\\*.js) до JavaScript-файлов, которые должны попасть в сборку до js-компонентов (jsPathsToConcatBeforeModulesJs) и JavaScript-файлов, которые должны быть подключены после JavaScript-файлов компонентов (jsPathsToConcatAfterModulesJs). \n\nЭто будет полезно, при разработке сайта на JavaScript-фреймворке с какими-либо своими сущностями (контроллер, роутер и т.д.). Вам не требуется лезть в таски, просто создавайте отдельные директории, указывайте, за какими файлами следить.\n\nТакже есть возможность отключить eslint для этих файлах (опции `lintJsCodeBeforeModules` и `lintJsCodeAfterModules`).\n\n### sourcemaps\n\nType: `Object`\n\nDefault: \n```javascript\nsourcemaps: {\n    js: {\n        active: true,\n        inline: true\n    },\n    css: {\n        active: true,\n        inline: true\n    }\n},\n```\n\nКонфиг для sourcemaps. Sourcemaps для js и css работают только в dev-режиме. \nactive {Boolean}: использовать sourcemap или нет.\ninline {Boolean}: использовать встроенные сорсмапы или генерировать их отдельным файлом.\n\n### notifyConfig\n\nКонфиг для модуля нотификаций.\n\nПри включенных вотчерах, при изменениях в файлах проекта будут выдаваться системные уведомления, в которых будет указано, какой файл изменен, какой таск выполнен.\n\nИмеет вложенные опции.\n\n#### useNotify\n\nType: `Boolean`\n\nDefault: `true`\n\nВключение нотификации. Отключить нотификации можно с помощью переменных окружения:\n```bash\nexport DISABLE_NOTIFIER=true;\n#или\nexport NODE_ENV=production;\n```\nПеременные окружения имеют больший вес и перезаписывают значение в tars-config.js\n\n#### title\n\nType: `String`\n\nDefault: `'TARS notification'`\n\nКаждая нотификация имеет тайтл. Если вы хотите видеть другой тайтл, то смело меняйте эту опцию.\n\n#### sounds\n\nЗвуковые уведомления при нотификациях\n\n##### onSuccess\n\nType: `String, undefined`\n\nDefault: `undefined`\n\nВ данную опцию передается название системного звука, который будет звучать при нотификации, если сборка прошла успешно. Если звуков не нужно, то просто оставляйте `undefined`.\n\n##### onError\n\nType: `String, undefined`\n\nDefault: `undefined`\n\nВ данную опцию передается название системного звука, который будет звучать при нотификации, если сборка прошла с ошибками. Если звуков не нужно, то просто оставляйте `undefined`.\n\n### minifyHtml\n\nType: `Boolean`\n\nDefault: `false`\n\nВключение минифицирования HTML. Если опция установлена в `false`, то скомпилированный HTML будет отформатирован.\n\n### generateStaticPath\n\nType: `Boolean`\n\nDefault: `true`\n\nВключает построение относительного пути от текущей страницы до папки со статикой. В случае использования сервера, который будет раздавать статику (например, режим livereload) путь до статики не будет генерироваться, так как статика раздается сервером.\n\n### devPath\n\nType: `String`\n\nDefault: `'./dev/'`\n\nВ данную опцию передается строка с относительным или абсолютным путем к той папке, куда должен собираться проект в режиме разработки.\nИспользование `/` после названия пути обязательно, чтобы не возникли проблемы с доступом к файлам.\n\n### buildPath\n\nType: `String`\n\nDefault: `'./builds/'`\n\nВ данную опцию передается строка с относительным или абсолютным путем к той папке, куда должен собираться проект.\nЕсли используется useBuildVersioning (использовать версионирование билдов), то каждый новый билд будет находится в отдельной папке с именем — версией билда, и каждая эта папка будет находится по пути, указанном в buildPath.\nИспользование `/` после названия пути обязательно, чтобы не возникли проблемы с доступом к файлам.\n\n### useBuildVersioning\n\nType: `Boolean`\n\nDefault: `true`\n\nИспользовать версионирование билдов. Название версии состоит из имени билда + дата создания билда (точность до секунды).\n\n### useArchiver\n\nType: `Boolean`\n\nDefault: `true`\n\nСоздание архива с готовой версткой. Архив создается внутри папки с билдом. \nЕсли вы указали в файле package.json имя проекта, то имя архива будет взято оттуда, иначе по умолчанию будет 'build'. Также будет добавлена дата создания билда (точность до секунды).\n\n### ulimit\n\nType: `Number`\n\nDefault: `4096`\n\nПо умолчанию, число одновременно открытых файлов в ОС (Unix-системах) ограничено. Так как TARS работает на Gulp, то число одновременно открытых файлов может быть велико. Чтобы избежать проблем с этим, можно настроить [ulimit](http://ss64.com/bash/ulimit.html) (в нашем случае настраивается число одновременно открытых файлов). Если в проекте используется значительное число файлов и часть из них не попадает в конечную сборку, то просто увеличьте даную опцию.\n\n\n## Частично изменяемые опции\n\nДанные опции можно менять только перед командой `init`, так как ни на какую команду они больше не влияют. Кроме `useImagesForDisplayWithDpi`, об этом подробнее ниже.\n\n### templater\n\nType: `String`\n\nDefault: `handlebars`\n\nOptions: `jade`, `pug`, `handlebars`\n\nВ данной опции указывается используемый шаблонизатор. Доступны jade, pug и handlebars. В опцию передается название шаблонизатора с маленькой буквы.\n\nЕсли вы хотите писать на простом html, то оставьте опцию без изменений.\n\n### cssPreprocessor\n\nType: `String`\n\nDefault: `scss`\n\nOptions: `scss`, `sass`, `less`, `stylus`\n\nВ данной опции указывается используемый css-препроцессор. Доступны scss, less или stylus. В опцию передается название css-препроцессора с маленькой буквы.\n\n### useImagesForDisplayWithDpi\n\nType: `Array`\n\nDefault: `[96]`\n\nВ данной опции указываются плотности пикселей различных экранов, которые будут поддерживаться вашим проектом. Поддерживаются значения:\n\n* 96 — 1 dppx (обычные экраны)\n* 192 — 2 dppx (ретина)\n* 288 — 3 dppx (например, nexus 5)\n* 384 - 4 dppx (например, nexus 6)\n\nНа основе данной опции создаются папки для png-изображений различных размеров, для разных экранов. Подробнее в разделе [Работа с изображениями](images-processing.md).\n\nДанную опцию можно менять когда угодно, но есть пара важных моментов. Если вы меняете данную опцию перед командой `gulp|tars init`, то больше ничего делать не нужно. Если опция меняется потом, то необходимо руками создать (или удалить) директории в папке `static/img/sprite/`. Формат названия папки — значение опции + dpi. Например, `192dpi`.\n\n### fs\n\nОпции для именования основных папок со статикой. Если вы меняете опции из этого блока перед командой `gulp|tars init`, то больше ничего делать не нужно. Если опция меняется потом, то необходимо руками переименовать соответствующие директории.\n\n#### staticFolderName\n\nType: `String`\n\nDefault: `'static'`\n\nИмя папки, в которой будет лежать статика проекта. Если вы только разрабатываете проект локально, то необходимо, чтобы значение этой опции совпадало со значением опции [staticPrefix](#staticPrefix)\n\n#### imagesFolderName\n\nType: `String`\n\nDefault: `'img'`\n\nИмя папки, в которой будут лежать картинки проекта. Чаще всего именно эта папка имеет различные значения, поэтому название этой директории опционально.\n\n#### componentsFolderName\n\nType: `String`\n\nDefault: `'components'`\n\nИмя папки, в которой будут лежать компоненты (модули для TARS версии 1.7.0 и ниже) проекта.\n\n## Depricated\n\n### useSVG\n\n**Опция больше не поддерживается, используйте svg.active**\n\nType: `Boolean`\n\nDefault: `true`\n\nВключение поддержки сборщиком svg-изображений.\n\n### staticPrefixForCss\n\n**Опция больше не поддерживается, а значение задается в tars/tars.js**\n\nType: `String`\n\nDefault: `../imageFolderName/`\n\nКастомный пути до папки со статикой из css-файлов. imageFolderName берется из опции [imagesFolderName](options.md#imagesFolderName)\n\n### useJsLintAndHint\n\n**Опция была переименована в [lint](#lint) и находится в конфиге js.**\n\n### autoprefixerConfig\n\nКакие еще браузеры доступны, можно глянуть [тут](https://github.com/postcss/autoprefixer#browsers).\n\n~~**Опция была переннесена в plugins-config.json.**~~\n\n**Опция была переннесена в .browserslistrc.**\n\n### browserSyncConfig\n\nКонфиг для модуля Browsersync. Данный модуль реализует возможность livereload в браузере, расшаривание верстки во внешний веб, создание локального сервера.\n\n#### baseDir\n#### port\n#### open\n#### browser\n#### startUrl\n#### useNotifyInBrowser\n#### injectChanges\n\n**Опция была переннесена в plugins-config.json. На данный момент вы можете передать любую [опцию для browsersync](https://www.browsersync.io/docs/options/).**\n\n### staticPrefix\n\nЗначение данной опции задает значение плейсхолдеру %=static=% (__static__ или %=staticPrefix=% до версии TARS 1.6.0), который может использоваться в любых файлах проекта.\n\n**Опция больше не поддерживается, а значение задается в tars/tars.js**\n"
  },
  {
    "path": "docs/ru/plugins-options.md",
    "content": "<p align=\"right\">\n<a href=\"../en/plugins-options.md\">English description</a> | Описание на русском\n</p>\n\n# Конфигурирование плагинов\n\nВ TARS версии 1.8.0 и выше появилась возможность конфигурировать почти все плагины (gulp-плагины и не только) в отдельном файле, plugins-config.json в корне проекта. Раньше для этого требовалось переопределять таск, в котором используется плагин, а иногда править файлы самого сборщика.\n\nИзменять можно 100% опций, но некоторые из плагинов должны быть настроены определенным образом, чтобы TARS работал корректно. Каждая такая опция описана в комментариях в plugins-config.json **Рекомендуется не менять их!** \n\nplugins-config.json — не просто json-файл. В нем вы можете использовать комментарии, и специальное выражение insert(). Об этом чуть подробнее.\n\nНекоторые конфиги зависят от текущего tars-config, например, base-dir для gulp-jade. Чтобы вам не приходилось менять это руками каждый раз при смене имени папки с компонентами, вы можете написать так:\n```js\n\"gulp-jade\": {\n    \"pretty\": true,\n    \"basedir\": \"markup/insert(tars.config.fs.componentsFolderName)\"\n}\n```\n\nВ этом случае, insert(tars.config.fs.componentsFolderName) будет заменено на то, что у вас находится в tars-config для componentsFolderName. Внутри insert() вы можете выполнить любую JavaScript функцию. **Важно обернуть insert() в кавычки сразу, чтобы JSON распарсился корректно. Не забудьте экранировать двойные кавычки, если они используются!**\n\nПример с gulp-jade будет интерпретирован следующим образом:\n```js\n\"gulp-jade\": {\n    \"pretty\": true,\n    \"basedir\": \"markup/components\"\n}\n\n\nПару примеров использования insert():\n```js\n\"example-plugin\": {\n    \"option\": \"insert(function() {return 'tars'})\"\n}\n```\n\nВ итоге получим:\n```js\n\"example-plugin\": {\n    \"option\": \"tars\"\n}\n```\n\n"
  },
  {
    "path": "docs/ru/scenarios.md",
    "content": "<p align=\"right\">\n<a href=\"../en/scenarios.md\">English description</a> | Описание на русском\n</p>\n\n# Сценарии использования\n\nПредполагается как минимум 3 сценария использования TARS. На самом деле вы можете придумать для себя свои. Основные будут перечислены тут:\n\n* Разработка с передачей в back-end для внедрения.\n* Разработка статического сайта локально.\n* Разработка статического сайта сразу готового к выкладке.\n\nБольше информации можно получить из [FAQ](faq.md).\n\nВо всех сценариях имеется в виду, что режим «разработка» (dev-таск) будет с любыми доступными ключами.\n\n\n## Разработка с передачей в back-end для внедрения\n\nВ данном случае, в tars-config важно выставить опцию minifyHtml в false. Также можно отключить removeConsoleLog (false), чтобы оставить все console.log без изменения. Возможно это может пригодиться внедряющей команде.\n\nВ tars-config, в опции devPath, так-же есть возможность указать новый путь для интеграции с back-end частью проекта.\n\nДалее, для удобства версионирвоания сборок можно включить опцию useBuildVersioning и useArchiver, чтобы иметь в каждой папке со собранным проектом готовый к отправке архив.\n\nПри сборке (build-таск) желательно не использовать ключ `--release`.\n\nДля проверки работоспособности минифицированных файлов можно использовать ключ `--min`. \n\n\n## Разработка статического сайта локально\n\nВ данном случае опция minifyHtml может быть любой, как вам удобно. Все остальные опции вы можете назначить как удобно, кроме useArchiver. Данную опцию рекомендуется отключить, чтобы не плодить ненужные архивы.\n\nПри сборке (build-таск) желательно использовать ключ `--release`.\n\n\n## Разработка статического сайта сразу готового к выкладке\n\nВсе тоже самое, что и для «Разработка статического сайта локально».\n\nПри сборке (build-таск) обязательно использовать ключ `--release`.\n"
  },
  {
    "path": "docs/ru/svg-processing.md",
    "content": "<p align=\"right\">\n<a href=\"../en/svg-processing.md\">English description</a> | Описание на русском\n</p>\n\n# Работа с SVG\n\nВ TARS поддерживается два workflow для работы с векторной графикой: SVG-спрайт и SVG-symbols. Эти два подхода отличаются от остальных (инлайн в HTML, инлайн в CSS, base64, SVG-stack) почти 100%-й поддержкой во всех современных браузерах (начиная с IE9 включительно), кешируемостью, быстродействием и удобством работы.\n\nВы можете использовать **только один тип работы** с SVG-графикой в проекте. Одновременно SVG-symbols и SVG-спрайт не поддерживаются. Вы можете указать все настройки проекта для работы с SVG-графикой в [конфигурационном файле проекта](options.md#svg).\n\n**Очень важно, чтобы при сохранении SVG-картинки в ней присутствовал атрибут viewBox! Сохраняйте SVG-картинку как объект, который может быть вставлен в HTML без изменений (в Adobe Illustrator это опция \"Image location – Embed\").**\n\n## SVG symbols\n\n**При выборе этого workflow сборка для IE8 недоступна**\n\nВ данном подходе SVG-изображения склеиваются в один общий SVG-файл, в котором каждая отдельная SVG-картинка представляется в виде [SVG-symbol](https://developer.mozilla.org/ru/docs/Web/SVG/Element/symbol). В этом случае вы можете переиспользовать каждую отдельную иконку несколько раз, задавать ей цвет (даже два) и размеры через CSS. Частично об этом подходе можно прочесть на [habrahabr.ru](https://habrahabr.ru/post/272505/) и в [западных источниках](https://css-tricks.com/svg-symbol-good-choice-icons/). \n\nИзображения, которые должны быть включены таким образом, необходимо складывать в папку (указан путь по умолчанию): `static/img/svg/`. Вложенность директорий **НЕ** поддерживается. \n\nПодключение этих иконок производится в шаблонах. В CSS можно лишь добавить цвета, размеры, заливку, цвет и толщину границ. Для подключения используются хелперы, которые генерируют весь необходимый HTML-код и атрибуты для подключения конкретной иконки.\n\nПодключение в Handlebars:\n\n```handlebars\n{{Icon iconName='iconName' className='customClass' iconWidth='25' iconHeight='25'}}\n```\n\nПодключение в Jade:\n\n```jade\n!= jadeHelpers.Icon.call(locals, {iconName: 'iconName', className: 'customClass', iconWidth: '25', iconHeight: '25'})\n```\n\nПодключение в Pug:\n\n```jade\n!= pugHelpers.Icon.call(locals, {iconName: 'iconName', className: 'customClass', iconWidth: '25', iconHeight: '25'})\n```\n\nПри подключении иконки вы можете задать два параметра: имя иконки (iconName), которая подключается (без расширения), имя класса (customClass), размеры (iconWidth, iconHeight). **Размеры можно не задавать, эти опции не обязательны и могут быть вычисленны автоматически**. Если имя класса не будет указано, то оно сгенерируется автоматически - по шаблону icon__iconName. Если не указаны размеры, то будут использованы размеры из svg файла. Иконки можно подключать как в шаблонах страниц, так и в компонентах. Данные хелперы сгенерируют следующий код:\n\n```html\n<svg class=\"chrome\" width=\"32px\" height=\"32px\">\n    <use xlink:href=\"#chrome\"></use>\n</svg>\n```\n\nФайл с готовыми символами генерируется в TARS автоматически. Остается только подключить его. В TARS поддерживается несколько способов подключения SVG-symbols:\n* **inject** — инжект в тело HTML;\n* **separate-file-with-link** — хранение в отдельном файле, при этом каждая иконка подключается из этого файла;\n* **separate-file** — хранение в отдельном файле.\n\nВ случае инжекта в use указывается только ID иконки (ее имя). Вы можете управлять, куда именно инжектить SVG-symbols с помощью шаблона %=symbols=%, который по умолчанию присутствует в шаблоне - если вы используете оригинальную версию TARS. **Нет необходимости удалять эти метки, а также подключение различных полифилов или скриптов для старых браузеров, так как они будут  автоматически удалены из готовой сборки, если они не используются!** \n\nВ случае хранения в отдельном файле с подключением из него, к ID иконки добавляется **полный путь** до этого файла.\n\n```html\n<svg class=\"chrome\" width=\"32px\" height=\"32px\">\n    <use xlink:href=\"static/images/svg-symbols.svg#chrome\"></use>\n</svg>\n```\n\nВ этом случае SVG-symbols кешируется браузером. При этом вы можете задать путь, по которому файл с SVG-symbols будет находится в проекте, с помощью опции pathToExternalSymbolsFile в конфигурационном файле проекта. По умолчанию файл создается в корне готовой сборки.\n\nДанный способ нативно поддерживается во всех современных браузерах, кроме IE9 - Edge. Для них в TARS предусмотрен полифил. Вы можете его не включать в сборку, если не поддерживаете IE. Код подключения полифила по умолчанию присутствует в шаблоне, если вы используете оригинальную версию TARS. **Нет необходимости удалять эти метки, а также подключение различных полифилов или скриптов для старых браузеров, так как они будут автоматически удалены из готовой сборки, если они не используются!**\n\nТретий способ подразумевает, что вы сами реализуете подключение SVG-symbols в шаблон. Вам необходимо будет написать код, который загрузит файл SVG-symbols и вставит его в код страницы. Наиболее интересные подходы описаны на [css-tricks](https://css-tricks.com/ajaxing-svg-sprite/) и [osvaldas.info](http://osvaldas.info/caching-svg-sprite-in-localstorage). Последний способ один из самых эффективных.\n\nКак использовать тот или иной тип подключения SVG-symbols вы можете узнать из [документации о конфиге проекта](options.md#svg).\n\n## SVG-спрайты\n\nВ данном подходе SVG-изображения склеиваются в один SVG-спрайт. SVG-изображения в release-версии минифицируются и к нему добавляется hash в название. Изображения, которые должны быть включены таким образом, необходимо складывать в папку (указан путь по умолчанию): `static/img/svg/`. Вложенность директорий **НЕ** поддерживается. \n\nПодключение SVG-спрайта производится с помощью миксина (пример на SCSS):\n\n```scss\n@include bg-svg($svg-image-name);     // Подключение svg-изображения\n```\n\nОбратите внимание, что в миксин передается **переменная** с именем исходной картинки (без расширения).\n\nМиксин `bg-svg` в CSS подключит SVG-спрайт в качестве фона, задаст все необходимые смещения и размеры. Если сборка выполнена с ключом `--ie` или `--ie8`, то будет создан спрайт с растрированными векторными изображениями. Вам не нужно думать о том, как это будет работать в IE8, так как TARS все сделает за вас.\n\nВ данном подходе вы не сможете задать цвет SVG-изображения через CSS. Необходимо, чтобы SVG-картинка уже была полностью готова к использованию, прежде чем она попадет в спрайт.\n\n\n"
  },
  {
    "path": "docs/ru/tasks-and-watchers.md",
    "content": "<p align=\"right\">\n<a href=\"../en/tasks-and-watchers.md\">English description</a> | Описание на русском\n</p>\n\n# Работа с тасками и вотчерами\n\nTARS – набор gulp-тасков, организованных особым образом. Каждый таск — отдельный файл (кроме составных, таких как build, dev и т.п.), в котором описывается последовательность действий над набором файлов. Также в TARS присутствуют вотчеры, которые позволяют запускать таски при изменении какого-либо файла. Таски и вотчеры бывают системные (встроенные в TARS по умолчанию) и пользовательские, с помощью которых можно расширить функциональность TARS.\n\nВ общем виде работа TARS в режиме разработки выглядит следующим образом:\n\n* при запуске запускаются все таски, которые требуются для сборки проекта;\n* после сборки запускаются вотчеры, которые будут следить за изменениями файлов и запускать определенные таски.\n\nВстроенные таски находятся в `tars/tasks`, разбиты по папкам в зависимости от типа таска. Встроенные вотчеры для тасков находятся в `tars/watchers`. Вы можете добавлять любые свои таски/вотчеры и размещать их в `tars/user-tasks`/`tars/user-watchers`.\n\nПри добавлении тасков и вотчеров рекомендуется использовать:\n* tars.config.fs.staticFolderName — для имени папки со статикой;\n* tars.config.fs.imagesFolderName — для имени папки с изображениями;\n* tars.templater.ext – содержит расширения для файлов выбранного шаблонизатора;\n* tars.cssPreproc.ext – содержит расширения для файлов выбранного css-препроцессора.\n\nЕсли вам требуется заменить какой-либо встроенный таск/вотчер, вам необходимо назвать его также, как тот таск/вотчер, который необходимо заменить. Важно соблюсти вложенность папок. Пример, справедливый как для тасков, так и для вотчеров, доступен вот такой встроенный таск:\n\n```\ntars/tasks/html/minify-html.js\n```\n\nНеобходимо, чтобы вместо встроенного `minify-html.js` подключался пользовательский. Для этого необходимо в папке `user-tasks` повторить ту же файловую структуру для файла таска и использовать такое же имя для самого таска:\n\n```\ntars/user-tasks/html/minify-html.js\n```\n\nВ этом случае в gulpfile.js будет подключен не встроенный, а пользовательский таск.\n\nТакже есть возможность отключить любой таск/вотчер, просто добавив знак `_` в начало названия этого таска/вотчера.\n\nЕсли вам требуется встроить пользовательский таск в уже существующую цепочку других тасков, например необходимо выполнять вашу задачу в рамках dev-таска, то необходимо переопределить dev-таск, указав именно ту цепочку задач, которая подойдет именно вам.\n\nБольше подробностей вы можете получить в соответствующих разделах документации о [тасках](tasks.md) и [вотчерах](watchers.md).\n"
  },
  {
    "path": "docs/ru/tasks.md",
    "content": "<p align=\"right\">\n<a href=\"../en/tasks.md\">English description</a> | Описание на русском\n</p>\n\n# Таски в TARS\n\nКаждый таск представляет из себя [commonJS-модуль](http://wiki.commonjs.org/wiki/Modules/1.1). Все таски включаются в gulpfile в корне проекта автоматически.\n\nПо умолчанию в gulpfile.js находятся только ссылки на основные таски, например, build ссылается на main:build. Таким образом вы сможете переопределить абсолютно любой таск, совсем не влезая в структуру сборщика.\n\nСвои таски можно создавать в директории user-tasks. По умолчанию там уже находится пример таска. Вообще, в TARS можно подключить любой gulp-task.\n\nПо умолчанию каждому таску требуется набор модулей для корректной работы:\n\n```javascript\nconst gulp = tars.packages.gulp;\nconst gutil = tars.packages.gutil;\nconst notifier = tars.helpers.notifier;\n```\n\nТакже, если требуется использовать livereload для данного таска, подключаем модуль browserSync:\n\n```javascript\nconst browserSync = tars.packages.browserSync;\n```\n\nЕсли требуются какие-либо еще зависимости, подключаем их тут же. При этом, зависимости, которых нет в основном package.json, можно занести в user-package.json, который находится в корне проекта. Формат такой же, как и у основного package.json\n\n**Не помещайте свои собственные зависимости в package.json. Помещайте их user-package.json** Исключением здесь может быть использование TARS-CLI. При инициализации проекта с помощью TARS-CLI и стандартного архива с TARS (из текущего репозитория) user-package.json не создается в папке с проектом. Вместо него будет обычный package.json TARS-CLI позволяет [инициализировать TARS с помощью любого zip-архива с TARS](https://github.com/tars/tars-cli#tars-init). Если вам необходимо, чтобы в package.json уже были какие-либо пакеты, то в вашем форке TARS занесите все пользовательские зависимости в user-package.json и они автоматом окажутся в package.json нового проекта при инициализации с помощью TARS-CLI. Данная функциональность доступна для TARS-CLI начиная с версии 1.1.8.\n\nПосле подключения зависимостей идет тело модуля, который будет экспортировать таск. Каждый таск описывается внутри экспортируемой функции. Во всех тасках и вотчерах досутпен глобальный объект tars, в котором находятся все данные, конфиги и т.д. текущего проекта. Экспортируемая функция возвращает полноценный gulp-таск. Далее делаем все как и с обычным таском для gulp.\n\nЕсли требуется нотификация, то таск должен оканчиваться следующим образом:\n\n```javascript\n// If you need to reload browser, uncomment the row below\n// .pipe(browserSync.reload({stream:true}))\n.pipe(\n    notifier('Example task is finished \\n')\n);\n```\n\nВ notifier передается строка, которая будет показываться в уведомлениях.\n\nТакже можно вызвать callback, или вернуть основной поток, если требуется выполнять таски в определенном порядке. Более подробно [здесь](http://frontender.info/handling-sync-tasks-with-gulp-js).\n\nМожет показаться, что в некоторых местах есть излишний код, есть обращения к файлам, а не потокам. Такие места есть, но это сделано в угоду модульности и легкой расширяемости. На самом деле, на скорость работы сборщика именно эти места не влияют.\n"
  },
  {
    "path": "docs/ru/update-guide.md",
    "content": "<p align=\"right\">\n<a href=\"../en/update-guide.md\">English description</a> | Описание на русском\n</p>\n\n# Руководство по обновлению TARS\n\n**С версии TARS 1.5.0 доступно автоматическое обновление проекта с помощью TARS-CLI. Вам больше не потребуется делать это вручную! Подробности можно прочитать [в документации TARS-CLI](https://github.com/tars/tars-cli/blob/master/docs/ru/update-actions.md). При использовании CLI, не нужно выполнять  операции, описанные ниже!**\n\nВ рамках мажорной версии (1.\\*.\\*, например) можно переносить папку markup (папка, в которой должны находиться исходники вашего проекта), в любую версию. В любой версии в рамках одной мажорной сборка пройдет успешно. Данное утверждение справедливо для TARS выше (и включая) версии 1.2.0. До 1.2.0 были небольшие изменения в файловой структуре и способе подключения компонентов в Handlebars. Все изменения доступны в [changelog](changelog.md).\n\nТаким образом, чтобы получить новую функциональность, которая вышла в новой минорной версии (\\*.4.\\*, например) достаточно:\n\n* [скачать новый TARS](https://github.com/tars/tars/archive/master.zip);\n* проинициализировать его с теми настройками, которые есть в вашем текущем проекте;\n* перенести папку markup из текущего проекта в новый TARS;\n* поправить конфиги, если это необходимо.\n\nПосле этого вы можете спокойно использовать новые фичи. Подробнее о системе версионирования можно прочитать [здесь](http://semver.org/lang/ru).\n\n**Повторюсь, с версии TARS 1.5.0 доступно автоматическое обновление проекта с помощью TARS-CLI. Вам больше не потребуется делать это вручную! Подробности можно прочитать [в документации TARS-CLI](https://github.com/tars/tars-cli/blob/master/docs/ru/update-actions.md)**\n\nЕсть исключение из этого правила. Например, была добавлена работа с coffee-файлами в одной из минорных версий. Если ваш проект использует только JavaScript, то вы также можете использовать любую минорную версию в рамках мажорной. Если вы хотите использовать coffee-файлы, то необходимо выбирать только ту версию, в которой были добавлены таски для работы с ними или версию выше.\n\nВ основном [readme](../README_RU.md) обязательно указано, с какой версии есть доступ к той или иной функциональности.\n\nТакже, если вы вносили изменения в файлы сборщика (что угодно еще, кроме папки markup), то необходимо эти изменения перенести вручную. Все последние изменения доступны по ссылке: [История изменений](changelog.md).\n\nДля перехода от одной мажорной версии к другой будет написано соответствующее руководство.\n"
  },
  {
    "path": "docs/ru/watchers.md",
    "content": "<p align=\"right\">\n<a href=\"../en/watchers.md\">English description</a> | Описание на русском\n</p>\n\n# Вотчеры в TARS\n\nКак и таски, вотчеры представляют из себя [commonJS-модуль](http://wiki.commonjs.org/wiki/Modules/1.1). Все вотчеры включаются в gulpfile в корне проекта автоматически.\n\nСвои вотчеры можно создавать в директории user-watchers. По умолчанию там уже находится пример вотчера. Разберем его подробнее.\n\nПо умолчанию каждому вотчеру требуется набор модулей для корректной работы:\n\n```javascript\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\nconst gutil = tars.packages.gutil;\nconst chokidar = tars.packages.chokidar;\nconst watcherLog = tars.helpers.watcherLog;\n```\n\n```javascript\n    return chokidar.watch(\n        /* String of path pattern or array of strings */,\n        Object.assign(tars.options.watch, {\n            // Options set bellow will override default from tars.options.watch\n            // If you need default options, you can use just tars.options.watch\n            ignored: /* String of path pattern or array of strings to ignore. If nothing to igonre — just set it to ''*/,\n            persistent: /* Boolean, true by default*/,\n            ignoreInitial: /* Boolean, true by default*/\n        })\n    ).on('all', function(event, path) {\n        watcherLog(event, path);\n        // You could start as many tasks as you need\n        runSequence(/* Task name (String) to start */);\n    });\n```\n\nВ chokidar.watch можно передать паттерн или массив паттернов путей до файлов, за которыми нужно следить.\n\nПосле паттернов передаются опции для chokidar. Если вам подходят опции по умолчанию, просто передайте вторым аргументом в chokidar.watch tars.options.watch. Если какие-либо свойства необходимо переопределить, используйте [Object.assign](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/assign). Первым параметром assign принимает то, чем мы будем переопределять, а вторым — что будем переопределять.\n\nВ опцию ignored можно передать паттерн или массив паттернов путей до файлов, которые нужно отфильтровать от слежки в рамках данного вотчера.\n\nВ gulp.start передается имя таска, который необходимо запустить при изменениях в файлах, за которыми следит данный вотчер. По умолчанию вотчер срабатывает на все операции с файлами (удаление, создание, переименовывание). Можно изменить это поведение, поменяв .on('all', function(event, path) all на нужное событие. Список доступных событий можно узнать в [документации к chokidar](https://github.com/paulmillr/chokidar#getting-started).\n"
  },
  {
    "path": "gulpfile.js",
    "content": "'use strict';\n\n// Tars main-module init\n// It is a global var\nrequire('./tars/tars');\n\nconst gulp = tars.packages.gulp;\n\n// Require system and user's tasks\n// You can add your own tasks.\n// All your tasks have to be in tars/user-tasks folder\ntars.helpers.tarsFsHelper.getTasks().forEach((file) => require(file)());\n\n// Register links to main tasks without namespace\n// Build-dev task. Build dev-version (without watchers)\ngulp.task(\n    'build-dev',\n    gulp.series('main:build-dev', (done) => done()),\n);\n\n// Dev task. Build dev-version with watchers and livereload\ngulp.task(\n    'dev',\n    gulp.series('main:dev', (done) => done()),\n);\n\n// Build task. Build release version\ngulp.task(\n    'build',\n    gulp.series('main:build', (done) => done()),\n);\n\n// Init task. Just start init task\ngulp.task(\n    'init',\n    gulp.series('service:init', (done) => done()),\n);\n\n// Update-deps task. Just start update-deps task\ngulp.task(\n    'update-deps',\n    gulp.series('service:update-deps', (done) => done()),\n);\n\n// Default task. Just start build task\ngulp.task(\n    'default',\n    gulp.series('build', (done) => done()),\n);\n"
  },
  {
    "path": "markup/components/_template/_template.js",
    "content": ""
  },
  {
    "path": "markup/components/_template/data/data.js",
    "content": "/* Module data structure */\n\n// moduleName: {\n//     dataType: {\n//         property: value\n//     }\n// }\n\n/* Module data example */\n\n_template: {\n    big: {\n        title: 'Hello world',\n        age: 10,\n        button: false\n    }\n}"
  },
  {
    "path": "markup/static/js/main.js",
    "content": "'use strict';\n\n/*\n    This file can be used as entry point for webpack!\n */\n"
  },
  {
    "path": "markup/static/misc/humans.txt",
    "content": "# humanstxt.org/\n# The humans responsible & technologies\n\n# TEAM\n\n    <name> -- <role> -- <twitter>\n\n# THANKS\n\n    <name>\n\n# TECHNOLOGIES\n\n    HTML5, CSS3, JS\n    \n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"tars\",\n  \"version\": \"1.15.1\",\n  \"engines\": {\n    \"node\": \"^16.x.x\"\n  },\n  \"os\": [\n    \"darwin\",\n    \"linux\",\n    \"win32\"\n  ],\n  \"description\": \"Powerfull markup builder\",\n  \"main\": \"gulpfile.js\",\n  \"dependencies\": {\n    \"@babel/core\": \"^7.5.5\",\n    \"@babel/preset-env\": \"^7.5.5\",\n    \"babel-loader\": \"^8.0.6\"\n  },\n  \"devDependencies\": {\n    \"autoprefixer\": \"^9.7.3\",\n    \"browser-sync\": \"^2.26.7\",\n    \"chokidar\": \"^3.3.1\",\n    \"comment-json\": \"^2.4.1\",\n    \"del\": \"^5.1.0\",\n    \"download\": \"4.4.3\",\n    \"eslint\": \"^6.8.0\",\n    \"eslint-loader\": \"^3.0.3\",\n    \"gulp\": \"^4.0.2\",\n    \"gulp-babel\": \"^8.0.0\",\n    \"gulp-cached\": \"^1.1.1\",\n    \"gulp-changed\": \"^4.0.2\",\n    \"gulp-compile-handlebars\": \"0.6.1\",\n    \"gulp-concat\": \"2.6.1\",\n    \"gulp-csso\": \"^4.0.1\",\n    \"gulp-data\": \"^1.3.1\",\n    \"gulp-eslint\": \"^6.0.0\",\n    \"gulp-html-prettify\": \"https://github.com/artem-malko/gulp-html-prettify/archive/master.tar.gz\",\n    \"gulp-htmlmin\": \"^5.0.1\",\n    \"gulp-if\": \"^3.0.0\",\n    \"gulp-imagemin\": \"6.2.0\",\n    \"gulp-importify\": \"^0.0.7\",\n    \"gulp-jade\": \"1.1.0\",\n    \"gulp-jade-inheritance\": \"https://github.com/tars/gulp-jade-inheritance/archive/master.tar.gz\",\n    \"gulp-less\": \"3.5.0\",\n    \"gulp-minify-html\": \"^1.0.6\",\n    \"gulp-notify\": \"^3.2.0\",\n    \"gulp-plumber\": \"^1.2.1\",\n    \"gulp-postcss\": \"^8.0.0\",\n    \"gulp-pug\": \"^4.0.1\",\n    \"gulp-pug-inheritance\": \"https://github.com/artem-malko/gulp-pug-inheritance/archive/master.tar.gz\",\n    \"gulp-rename\": \"^1.4.0\",\n    \"gulp-replace-task\": \"0.11.0\",\n    \"gulp-sass\": \"^5.1.0\",\n    \"gulp-sourcemaps\": \"^1.6.0\",\n    \"gulp-stylus\": \"^2.7.0\",\n    \"gulp-svg-spritesheet\": \"https://github.com/artem-malko/gulp-svg-spritesheet/archive/master.tar.gz\",\n    \"gulp-svg-symbols\": \"https://github.com/artem-malko/gulp-svg-symbols/archive/master.tar.gz\",\n    \"gulp-svg2png\": \"1.0.2\",\n    \"gulp-terser\": \"^1.2.0\",\n    \"gulp-uglify\": \"^3.0.2\",\n    \"gulp-util\": \"3.0.8\",\n    \"gulp-zip\": \"^5.0.0\",\n    \"gulp.spritesmith\": \"^6.10.1\",\n    \"gulp4-run-sequence\": \"^1.0.0\",\n    \"mkdirp\": \"^0.5.1\",\n    \"ncp\": \"^2.0.0\",\n    \"run-sequence\": \"^2.2.1\",\n    \"sass\": \"^1.49.9\",\n    \"source-map-loader\": \"^0.2.4\",\n    \"stream-combiner\": \"^0.2.2\",\n    \"terser-webpack-plugin\": \"1.4.1\",\n    \"through2\": \"^3.0.1\",\n    \"uglifyjs-webpack-plugin\": \"2.2.0\",\n    \"webpack\": \"^4.39.1\",\n    \"webpack-dev-middleware\": \"^3.7.0\",\n    \"webpack-hot-middleware\": \"^2.25.0\"\n  },\n  \"optionalDependencies\": {\n    \"fsevents\": \"^2.0.7\",\n    \"posix\": \"^4.2.0\"\n  },\n  \"scripts\": {\n    \"install\": \"node ./tars/helpers/install-additional-deps.js\",\n    \"lint\": \"eslint webpack.config.js tars/*.js tars/tasks/**/*.js tars/watchers/**/*.js tars/helpers/**/*.js gulpfile.js --rule 'valid-jsdoc: [0, {}]'\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/tars/tars.git\"\n  },\n  \"author\": \"Artem Malko\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/tars/tars/issues\"\n  },\n  \"homepage\": \"https://github.com/tars/tars\",\n  \"keywords\": [\n    \"gulp\",\n    \"makeup\",\n    \"markup\"\n  ]\n}\n"
  },
  {
    "path": "plugins-config.json",
    "content": "{\n    // You can find docs for this file here: ./docs/en|ru/plugins-options.md\n\n    \"browserSync\": {\n        \"startPath\": \"/index.html\",\n        \"server\": {\n            \"baseDir\": \"./dev\"\n        },\n        \"port\": 3004,\n        \"open\": true,\n        \"notify\": true,\n\n        // Choose browser to open\n        // @type {String|Array}\n        // Example: ['google chrome', 'firefox']\n        // Avalible: safari, internet explorer, google chrome, firefox, opera\n        \"browser\": \"default\",\n        \"injectChanges\": false\n    },\n\n    \"gulp-sass\": {\n        \"outputStyle\": \"expanded\",\n        \"includePaths\": [\"./\", \"./markup/\", \"./node_modules/\", \"./bower_components/\"]\n    },\n\n    \"gulp-less\": {\n        \"paths\": [\"./\", \"./markup/\", \"./node_modules/\", \"./bower_components/\"]\n    },\n    \"gulp-stylus\": {\n        \"resolve url\": true,\n        \"include css\": true,\n        \"include\": [\"./\", \"./markup/\", \"./node_modules/\", \"./bower_components/\"]\n    },\n\n    // helpers option is set in make-sprite-for-svg.\n    // It is strongly recommended to not override it!\n    \"gulp-compile-handlebars\": {\n        \"batch\": [\"./markup/insert(tars.config.fs.componentsFolderName)\"]\n    },\n\n    // locals option is set in ./tars.js\n    \"gulp-pug\": {\n        \"pretty\": true,\n        \"basedir\": \"markup/insert(tars.config.fs.componentsFolderName)\"\n    },\n\n    // locals option is set in ./tars.js\n    \"gulp-jade\": {\n        \"pretty\": true,\n        \"basedir\": \"markup/insert(tars.config.fs.componentsFolderName)\"\n    },\n\n    \"gulp-csso\": {\n        \"restructure\": true\n    },\n\n    // cssPathSvg, templateSrc, templateDest and imgName is set in make-sprite-for-svg.\n    // It is strongly recommended to not override these options!\n    \"gulp-svg-spritesheet\": {\n        \"padding\": 4\n    },\n\n    \"gulp.spritesmith\": {\n        // Config for spritesmith in task make-fallback-for-svg\n        // imgName, cssName, cssTemplate is set in task.\n        // It is strongly recommended to not override these options!\n        \"svg-fallback\": {\n            \"algorithm\": \"binary-tree\",\n            \"padding\": 4\n        },\n\n        // Config for spritesmith in task make-sprite\n        // imgName, cssName, cssTemplate is set in task.\n        // It is strongly recommended to not override these options!\n        \"regular-raster-sprite\": {\n            \"algorithm\": \"binary-tree\",\n            \"padding\": 4\n        }\n    },\n\n    // This config can be overrided by user-tasks/html/helpers/modify-options\n    \"gulp-htmlmin\": {\n        \"minifyCSS\": true,\n        \"minifyJS\": true,\n        \"collapseWhitespace\": true,\n        \"conservativeCollapse\": true,\n        \"collapseInlineTagWhitespace\": true,\n        \"removeRedundantAttributes\": true,\n        \"removeStyleLinkTypeAttributes\": true\n    },\n\n    // This config can be overrided by user-tasks/html/helpers/modify-options\n    \"gulp-html-prettify\": {\n        \"indent_char\": \" \",\n        \"indent_size\": 4,\n        \"indent_inner_html\": true\n    },\n\n    \"gulp-terser\": {\n        \"mangle\": false,\n        \"compress\": {\n            \"drop_console\": \"insert(tars.config.js.removeConsoleLog)\",\n            \"drop_debugger\": \"insert(tars.config.js.removeConsoleLog)\"\n        }\n    }\n}\n"
  },
  {
    "path": "prettier.config.js",
    "content": "module.exports = {\n    singleQuote: true,\n    trailingComma: 'all',\n    arrowParens: 'always',\n    printWidth: 110,\n    semi: true,\n};\n"
  },
  {
    "path": "tars/helpers/filter-files-by-path.js",
    "content": "'use strict';\n\nconst through2 = tars.packages.through2;\n\n/**\n * Filter files in pipe via it's path\n */\nmodule.exports = function filterFilesByPath(patterns) {\n    const patternsToCheck = [].concat(patterns);\n\n    return through2.obj(function (file, enc, callback) {\n        const filePath = file.path.replace(/\\\\/g, '/');\n        let checkStatus = true;\n\n        patternsToCheck.forEach(pattern => {\n            if (pattern.test(filePath)) {\n                checkStatus = false;\n            }\n        });\n\n        if (checkStatus) {\n            this.push(file); // eslint-disable-line no-invalid-this\n        }\n\n        return callback();\n    }, callback => callback());\n};\n"
  },
  {
    "path": "tars/helpers/get-templater-name.js",
    "content": "'use strict';\n\n/**\n * Get correct templater name\n * @return {string} Templater name\n */\nmodule.exports = function getTemplaterName(templaterNameFromConfig) {\n    switch (templaterNameFromConfig) {\n        case 'handelbars':\n        case 'handlebars':\n        case 'hdb':\n        case 'hb':\n            return 'handlebars';\n        case 'jade':\n            return 'jade';\n        case 'pug':\n        default:\n            return 'pug';\n    }\n};\n"
  },
  {
    "path": "tars/helpers/install-additional-deps.js",
    "content": "'use strict';\n\n// It is a global var\nrequire('../tars');\n\nconst exec = require('child_process').exec;\nlet usersDeps;\n\ntry {\n    usersDeps = require(process.cwd() + '/user-package');\n} catch (error) {\n    if (error.code !== 'MODULE_NOT_FOUND') {\n        console.error('User-package.json is not valid!\\n');\n        console.error(error.stack);\n    } else {\n        console.log('User-package.json is not exist. Additional deps won\\'t be installed.');\n        console.log('It is not an Error, it is just warning!');\n    }\n}\n\n/* eslint-disable no-loop-func */\n\nif (usersDeps && usersDeps.dependencies) {\n    for (let dep in usersDeps.dependencies) {\n        if (dep) {\n            exec('npm i ' + dep + '@' + usersDeps.dependencies[dep], (error, stdout, stderr) => {\n                if (error) {\n                    console.log(stderr);\n                } else {\n                    console.log(stdout);\n                }\n            });\n        }\n    }\n}\n\n/* eslint-enable no-loop-func */\n"
  },
  {
    "path": "tars/helpers/modify-date-formatter.js",
    "content": "'use strict';\n\n/**\n * Date formatter for Gulp notify. It showes only hours, minutes and seconds\n * @param  {number} timeItem hours, minutes or seconds\n * @return {string}          String with formatted time\n */\nfunction formatTime(timeItem) {\n    if (timeItem < 10) {\n        timeItem = '0' + timeItem;\n    }\n    return timeItem;\n}\n\nmodule.exports = {\n    /**\n     * Get time of last modify of something (css, js and etc)\n     * @return {string} String with formatted time\n     */\n    getTimeOfModify() {\n        const currentDate = new Date();\n        const hours = currentDate.getHours();\n        const minutes = currentDate.getMinutes();\n        const seconds = currentDate.getSeconds();\n\n        return formatTime(hours) + ':' + formatTime(minutes) + ':' + formatTime(seconds);\n    }\n};\n"
  },
  {
    "path": "tars/helpers/notifier.js",
    "content": "'use strict';\n\nconst notify = tars.packages.notify;\nconst gutil = tars.packages.gutil;\nconst notifyConfig = tars.config.notifyConfig;\nconst path = require('path');\n\nfunction cutUselessLog(error) {\n    return error.message.replace(/(at\\sParser\\.pp\\.raise[\\s\\S]*)/, '');\n}\n\n/**\n * Notify helper\n */\nmodule.exports = {\n    /**\n     * On error notifier\n     * @param  {String} message Error message\n     * @param  {Error} error    Error object\n     * @return {Pipe}\n     */\n    error(message, error, params) {\n        message = message || 'Something is happen while working.';\n        error = error || new Error();\n        params = params || {};\n\n        const resultMessage = '\\n' + message + '\\nLook in the console for details.\\n';\n\n        if (!(error instanceof(Error))) {\n            error = new Error(error);\n        }\n\n        if (process.env.NODE_ENV !== 'production' && !process.env.DISABLE_NOTIFIER) {\n            notify.onError({\n                sound: notifyConfig.sounds.onError,\n                title: notifyConfig.title,\n                message: resultMessage,\n                icon: path.resolve(tars.root + '/icons/tars_error.png'),\n                onLast: true\n            })(error);\n        } else {\n            console.error(gutil.colors.red(message + '\\n'));\n        }\n\n        if (error.message) {\n            console.log(gutil.colors.underline.red('Error details:\\n'));\n            console.error(cutUselessLog(error));\n            console.log(gutil.colors.red('_______________\\n'));\n        }\n\n        return tars.packages.gutil.noop();\n    },\n\n    /**\n     * On success notifier\n     * @param  {String}  message  Success message\n     * @param  {Boolean} onLast   Use notify only on last changed file\n     * @return {Pipe}\n     */\n    success(message, params) {\n\n        if (notifyConfig.useNotify && tars.options.notify && process.env.NODE_ENV !== 'production') {\n            params = params || {};\n\n            const defaultConfig = {\n                sound: notifyConfig.sounds.onSuccess,\n                title: notifyConfig.title,\n                templateOptions: {\n                    date: tars.helpers.dateFormatter.getTimeOfModify()\n                },\n                icon: path.resolve(tars.root + '/icons/tars.png')\n            };\n            let resultMessage = message + '\\n' || 'Task\\'ve been finished\\n';\n\n            resultMessage += notifyConfig.taskFinishedText + '<%= options.date %>';\n\n            if (params.notStream) {\n                return notify(defaultConfig).write(resultMessage);\n            }\n\n            return notify(\n                Object.assign(\n                    defaultConfig,\n                    {\n                        onLast: params.onLast || true,\n                        message: resultMessage\n                    }\n                )\n            );\n        }\n\n        return tars.packages.gutil.noop();\n    }\n};\n"
  },
  {
    "path": "tars/helpers/plugins-config-processing.js",
    "content": "'use strict';\n\nconst json = tars.require('comment-json');\nconst fs = require('fs');\nconst cwd = process.cwd();\n\n/**\n * Execute function insert() in plugins-config.json\n */\nmodule.exports = function makePluginsConfig() {\n    const rawPluginsConfig = json.parse(fs.readFileSync(`${cwd}/plugins-config.json`).toString());\n    const stringifiedPluginsConfig = json.stringify(rawPluginsConfig, null, 2);\n    const processedPluginsConfig = stringifiedPluginsConfig.replace(\n        /insert\\(([\\w.\\-()`\\{\\/}$\\s]+)\\)/gi,\n        (match, p1) => eval(p1)\n    );\n\n    return json.parse(processedPluginsConfig);\n};\n"
  },
  {
    "path": "tars/helpers/set-build-version.js",
    "content": "'use strict';\n\n/**\n * Generate build version\n * @return {String} build version\n */\nmodule.exports = function setBuildVersion() {\n    // build version is current date without spaces (replaced to _) and without time zone info.\n    return '_ver-' + new Date()\n        .toString()\n        .replace(/\\s\\w+\\+.*/, '')\n        .replace(/\\s|:/g, '_');\n};\n"
  },
  {
    "path": "tars/helpers/set-ulimit.js",
    "content": "'use strict';\n\n/**\n * Set ulimit to tars.config.ulimit\n * @return {Boolean}\n */\nmodule.exports = function setUlimit() {\n    const limit = tars.config.ulimit;\n    let posix;\n\n    try {\n        posix = require('posix');\n    } catch (ex) {\n        return false;\n    }\n\n    if (posix) {\n        try {\n            posix.setrlimit('nofile', { soft: limit });\n            return true;\n        } catch (ex) {\n            console.log('Error while ulimit setting');\n            return false;\n        }\n    }\n    return false;\n};\n"
  },
  {
    "path": "tars/helpers/skip-task-with-empty-pipe.js",
    "content": "'use strict';\n\nconst through2 = tars.packages.through2;\n\n/**\n * Skip task if there are no any files in pipe\n * @param  {String}   taskName        The name of task to skip\n * @param  {Callback} skipCallback    Callback for task skipping\n * @return {Object}                   Pipe\n */\nmodule.exports = function skipTaskWithEmptyPipe(taskName, skipCallback) {\n    let filesCount = 0;\n\n    return through2.obj(function (file, enc, callback) {\n\n        if (!file.isNull()) {\n            filesCount++;\n        }\n\n        this.push(file); // eslint-disable-line no-invalid-this\n\n        return callback();\n    }, (continueCallback) => {\n\n        if (filesCount) {\n            return continueCallback();\n        } else {\n            tars.skipTaskLog(taskName, 'No files were passed');\n            return skipCallback();\n        }\n    });\n};\n"
  },
  {
    "path": "tars/helpers/start-screen-generator.js",
    "content": "'use strict';\n\n/**\n * Output in the begining\n * @param  {Object} gutil Utils for gulp\n */\nmodule.exports = gutil => {\n    const currentCommand = process.argv.slice(2)[0];\n    const silentCommands = ['init', 're-init', 'update-deps'];\n    const usedFlagsArray = Object.keys(tars.flags);\n\n    // Do not show if command was init, re-init or update-deps\n    if (silentCommands.indexOf(currentCommand) > -1) {\n        return;\n    }\n\n    // Log warning, if it is not CLI-mode\n    if (!tars.cli) {\n        if (tars.isDevMode) {\n            console.log(gutil.colors.yellow.inverse('\\n----------------------------------------------------------------------'));\n            tars.say(gutil.colors.red.bold('You\\'ve started TARS via gulp.'));\n            tars.say(gutil.colors.red.bold('This mode is depricated for developing.'));\n            tars.say(gutil.colors.red.bold('Please, do not use \"dev\" tasks in with mode.\\n'));\n            tars.say('Install tars-cli for developing.');\n            tars.say('Run the command ' + gutil.colors.cyan('\"npm i -g tars-cli\"') + ', to install tars-cli.');\n            tars.say('More info: https://github.com/tars/tars-cli.');\n            console.log(gutil.colors.yellow.inverse('\\n----------------------------------------------------------------------'));\n        }\n\n        console.log('\\n----------------------------------------------------------------------------');\n        tars.say('Build have been started. You are using:\\n');\n\n        if (tars.flags.release) {\n            tars.say('• release mode;');\n        }\n\n        if (tars.flags.min) {\n            tars.say('• minify mode;');\n        }\n\n        if (tars.flags.lr) {\n            tars.say('• livereload mode;');\n        }\n\n        if (tars.flags.tunnel) {\n            tars.say('• tunnel mode;');\n        }\n\n        if (tars.flags.ie8 || tars.flags.ie) {\n            tars.say('• ie8 maintenance;');\n        }\n\n        if (tars.flags.ie9 || tars.flags.ie) {\n            tars.say('• ie9 maintenance;');\n        }\n\n        if (usedFlagsArray.length === 1) {\n            tars.say(gutil.colors.black.bold('No modes.'));\n        }\n\n        console.log('\\n');\n        tars.say('Have a nice work!');\n        tars.say('Please wait for a moment, while I\\'m preparing builder for working...');\n\n        console.log('----------------------------------------------------------------------------\\n');\n    }\n};\n"
  },
  {
    "path": "tars/helpers/string-helper.js",
    "content": "'use strict';\n\n/**\n * Helper for watcher logging\n * @param  {String} event Type of event\n * @param  {String} path  Path of changed file\n */\nmodule.exports = {\n    /**\n     * Capitalize first letter of a string\n     * @param  {String} str String to modify\n     * @return {String}     String, with the first letter capitalized\n     */\n    capitalizeFirstLetter(str) {\n        str = str && String(str) || '';\n\n        return str.charAt(0).toUpperCase() + str.substr(1);\n    }\n};\n"
  },
  {
    "path": "tars/helpers/tars-fs-helper.js",
    "content": "'use strict';\n\nconst fs = require('fs');\nconst path = require('path');\n\n/**\n * Check, that file is task or watcher\n * All files with\n * 1) \"example-\" in name or path;\n * 2) \"/helpers/\" in path;\n * 3) start from _ char;\n * All that files won't be used\n * @param  {String}  pathToFile Path to file to check\n * @param  {String}  file       File to check\n * @return {Boolean}            Is file task or watcher\n */\nfunction isValidFile(pathToFile, file) {\n    return !pathToFile.match(/example-|[\\/\\\\]helpers[\\/\\\\]/i)\n            && !file.match(/^_/) && pathToFile.match(/js$/i);\n}\n\n/**\n * Get hashmap of files and path to that files\n * @param  {String} dir Folder to read\n * @return {Object}     Hashmap of files and paths to that files\n */\nfunction getFilesFromDir(dir) {\n    const list = fs.readdirSync(dir);\n    let results = {};\n\n    list.forEach(file => {\n        const fullPathToFile = dir + '/' + file;\n        const stat = fs.statSync(fullPathToFile);\n\n        if (stat && stat.isDirectory()) {\n            results = Object.assign(results, getFilesFromDir(fullPathToFile));\n        } else {\n            if (isValidFile(fullPathToFile, file)) {\n                results[path.parse(dir).name + '/' + file] = fullPathToFile;\n            }\n        }\n    });\n\n    return results;\n}\n\n/**\n * Merge two objects from arguments and make array from ready object\n * @param  {Object} systemItems System tasks/watchers\n * @param  {Object} usersItems  User's tasks/watchers\n * @return {Array}              Array of unique system/user's tasks/watchers\n */\nfunction getReadyUniqueItemsArray(systemItems, usersItems) {\n    const uniqueItems = Object.assign(systemItems, usersItems);\n\n    return Object.keys(uniqueItems).map(key => uniqueItems[key]);\n}\n\nmodule.exports = {\n    /**\n      * Get paths to all tasks, user's and system\n      * @return {Array} Array of unique system/user's tasks\n      */\n    getTasks() {\n        const systemTasks = getFilesFromDir(tars.root + '/tasks');\n        const userTasks = getFilesFromDir(tars.root + '/user-tasks');\n        const readyTasksArray = getReadyUniqueItemsArray(systemTasks, userTasks);\n\n        return readyTasksArray;\n    },\n\n    /**\n      * Get paths to all watchers, user's and system\n      * @return {Array} Array of unique system/user's watchers\n      */\n    getWatchers() {\n        const systemWatchers = getFilesFromDir(tars.root + '/watchers');\n        const userWatchers = getFilesFromDir(tars.root + '/user-watchers');\n        const readyWatchersArray = getReadyUniqueItemsArray(systemWatchers, userWatchers);\n\n        return readyWatchersArray;\n    }\n};\n"
  },
  {
    "path": "tars/helpers/watcher-log.js",
    "content": "'use strict';\n\nconst gutil = tars.packages.gutil;\n\n/**\n * Helper for watcher logging\n * @param  {String} event Type of event\n * @param  {String} path  Path of changed file\n */\nmodule.exports = (event, path) => {\n    gutil.log('File: ' + gutil.colors.green.bold(path) + ' Event: ' + gutil.colors.green.bold(event));\n};\n"
  },
  {
    "path": "tars/tars.js",
    "content": "'use strict';\n\n/**\n * Main module for TARS\n */\n\n/**\n * Reqiure node-modules from TARS-CLI, if tars was executed via CLI and from local node_modules instead\n * @param  {String} packageName Name of the required package\n * @return {Object}             Required package\n */\nfunction tarsRequire(packageName) {\n    // Log for TARS debug\n    if (process.env.TARS_DEBUG) {\n        console.log('Module required: ', packageName);\n    }\n\n    if (process.env.npmRoot) {\n        try {\n            return require(process.env.npmRoot + packageName);\n        } catch (error) {\n            const util = require('util');\n\n            console.log('\\n');\n            util.inspect.styles.string = 'red';\n            console.log('---------------------------------------------------------------------------------');\n            console.dir('It seems, that TARS in current project is not compatible with current TARS-CLI!', {\n                colors: true,\n            });\n            console.dir(`Package \"${packageName}\" is not available.`, {\n                colors: true,\n            });\n            console.dir('Update TARS-CLI via \"tars update\" and your project via \"tars update-project\"', {\n                colors: true,\n            });\n            console.dir('Please, write to the tars.builder@gmail.com, if update did not help you.', {\n                colors: true,\n            });\n            console.log(\n                '---------------------------------------------------------------------------------\\n',\n            );\n\n            throw new Error(`Package ${packageName} is not available.`);\n        }\n    }\n\n    return require(packageName);\n}\n\n// TARS is a global var\nglobal.tars = {\n    require: tarsRequire,\n    cli: process.env.npmRoot ? true : false,\n    root: __dirname,\n    packageInfo: require('../package.json'),\n    config: require('../tars-config'),\n};\n\nconst gutil = tars.require('gulp-util');\nconst os = require('os');\nconst helpersDirPath = './helpers';\nconst cssPreprocName = tars.config.cssPreprocessor.toLowerCase();\nconst templaterName = require(helpersDirPath + '/get-templater-name')(tars.config.templater.toLowerCase());\nconst buildVersion = require(helpersDirPath + '/set-build-version')();\nconst useBuildVersioning = tars.config.useBuildVersioning;\n\n// Config for plugins and packages, which is used in TARS\ntars.pluginsConfig = require(helpersDirPath + '/plugins-config-processing')();\n\n// Flags\ntars.flags = gutil.env;\n\n// Dev mode flag\ntars.isDevMode = !tars.flags.release && !tars.flags.min && !tars.flags.m;\ntars.useLiveReload = tars.flags.lr || tars.flags.livereload || tars.flags.tunnel;\n\n// Package name\ntars.packageInfo.name = tars.packageInfo.name || 'awesome_project';\n\n/**\n * Log messages from TARS\n * @param  {String} message Message to say\n */\ntars.say = function say(message) {\n    // Use «nice» output only for OSX\n    if (os.platform() === 'darwin') {\n        console.log(gutil.colors.cyan.bold('🅃 🄰 🅁 🅂 : ') + gutil.colors.white.bold(message));\n    } else {\n        console.log(gutil.colors.cyan.bold('[ TARS ]: ') + gutil.colors.white.bold(message));\n    }\n};\n\n// Generate start screen\n// We have to call it here, cause it has to be before all actions\nrequire(helpersDirPath + '/start-screen-generator')(gutil);\n\n// Set ulimit to 4096 for *nix FS. It needs to work with big amount of files\n// But you can set any value in config\nif (os.platform() !== 'win32') {\n    require(helpersDirPath + '/set-ulimit')();\n}\n\n/**\n * Log info about skipped task\n * @param  {String} taskName Skipped task name\n * @param  {String} reason   Reason ot the skip\n */\ntars.skipTaskLog = function skipTaskLog(taskName, reason) {\n    gutil.log(gutil.colors.white.bold(`Skipped  '${gutil.colors.cyan(taskName)}' ${reason}`));\n};\n\n/**\n * Beginning of a path for static files for using in css\n * You have to use %=static=% or __static__ placeholder in paths to static in css files\n * Example: background: url('%=static=%logo.png');\n * Will be replaced to background: url('../img/logo.png');\n * %=staticPrefixForCss=% prefix works, but it is deprecated!\n */\ntars.config.staticPrefixForCss = `../${tars.config.fs.imagesFolderName}/`;\n\n// Fix svg config\nif (tars.config.hasOwnProperty('useSVG')) {\n    tars.config.svg = {\n        active: tars.config.useSVG,\n        workflow: 'sprite',\n    };\n} else {\n    const symbolsLoadingType = tars.config.svg.symbolsConfig.loadingType;\n\n    if (\n        symbolsLoadingType !== 'inject' &&\n        symbolsLoadingType !== 'separate-file-with-link' &&\n        symbolsLoadingType !== 'separate-file'\n    ) {\n        tars.say(\n            gutil.colors.yellow(\n                `TARS does not support option ${tars.config.svg.symbolsConfig.loadingType} for symbols loading`,\n            ),\n        );\n        tars.say(\n            gutil.colors.yellow('You can use only \"inject\", \"separate-file\" and \"separate-file-with-link\"'),\n        );\n        tars.say(gutil.colors.yellow('\"inject\" will be used now!'));\n        tars.config.svg.symbolsConfig.loadingType = 'inject';\n    }\n}\n\nif (tars.config.svg.active && tars.config.svg.workflow === 'symbols' && (tars.flags.ie || tars.flags.ie8)) {\n    tars.say(gutil.colors.yellow('Build for IE8 is not available, then svg-symbols is used!'));\n}\n\n// availability check '/'\nif (tars.config.devPath.substr(-1) !== '/') {\n    tars.config.devPath = tars.config.devPath + '/';\n}\nif (tars.config.buildPath.substr(-1) !== '/') {\n    tars.config.buildPath = tars.config.buildPath + '/';\n}\n\n// Build options\ntars.options = {\n    notify: true,\n    build: {\n        hash: tars.flags.release\n            ? Math.random()\n                  .toString(36)\n                  .substring(7)\n            : '',\n        path: useBuildVersioning ? `${tars.config.buildPath}build${buildVersion}/` : tars.config.buildPath,\n        version: useBuildVersioning ? buildVersion : '',\n    },\n    watch: {\n        isActive: false,\n        ignored: '',\n        persistent: true,\n        ignoreInitial: true,\n    },\n};\n\n// Required packages\n// There are only common packages\ntars.packages = {\n    autoprefixer: tars.require('autoprefixer'),\n    browserSync: tars.require('browser-sync'),\n    cache: tars.require('gulp-cached'),\n    changed: tars.require('gulp-changed'),\n    chokidar: tars.require('chokidar'),\n    concat: tars.require('gulp-concat'),\n    data: tars.require('gulp-data'),\n    del: tars.require('del'),\n    gulp: require('gulp'),\n    gulpif: tars.require('gulp-if'),\n    gutil: gutil,\n    importify: tars.require('gulp-importify'),\n    notify: tars.require('gulp-notify'),\n    plumber: tars.require('gulp-plumber'),\n    postcss: tars.require('gulp-postcss'),\n    rename: tars.require('gulp-rename'),\n    replace: tars.require('gulp-replace-task'),\n    runSequence: tars.require('gulp4-run-sequence'),\n    sourcemaps: tars.require('gulp-sourcemaps'),\n    streamCombiner: tars.require('stream-combiner'),\n    through2: tars.require('through2'),\n};\n\n// Links to helpers\ntars.helpers = {\n    buildVersion,\n    dateFormatter: require(helpersDirPath + '/modify-date-formatter'),\n    tarsFsHelper: require(helpersDirPath + '/tars-fs-helper'),\n    notifier: require(helpersDirPath + '/notifier'),\n    watcherLog: require(helpersDirPath + '/watcher-log'),\n    skipTaskWithEmptyPipe: require(helpersDirPath + '/skip-task-with-empty-pipe'),\n    stringHelper: require(helpersDirPath + '/string-helper'),\n    filterFilesByPath: require(helpersDirPath + '/filter-files-by-path'),\n};\n\n/**\n * Info about css preprocessor\n * @type {String}   cssPreproc.name\n * @type {String}   cssPreproc.ext\n * @type {String}   cssPreproc.mainExt\n * @type {Function} cssPreproc.ext\n */\nswitch (cssPreprocName) {\n    case 'stylus':\n        tars.cssPreproc = {\n            name: 'stylus',\n            ext: 'styl',\n            mainExt: 'styl',\n            preprocessor: () => tars.require('gulp-stylus')(tars.pluginsConfig['gulp-stylus']),\n        };\n        break;\n    case 'less':\n        tars.cssPreproc = {\n            name: 'less',\n            ext: 'less',\n            mainExt: 'less',\n            preprocessor: () => tars.require('gulp-less')(tars.pluginsConfig['gulp-less']),\n        };\n        break;\n    case 'scss':\n    default:\n        tars.cssPreproc = {\n            name: 'scss',\n            ext: '{scss,sass}',\n            mainExt: 'scss',\n            preprocessor: () => {\n                const sass = tars.require('gulp-sass')(tars.require('sass'));\n                /**\n                 * FIXME: Dirty hack for fix error:\n                 *  TypeError: Class constructor CommentArray cannot be invoked without 'new'\n                 *  you need to find where the CommentArray comes from and get rid of it\n                 */\n                const { includePaths, ...options } = tars.pluginsConfig['gulp-sass'];\n                return sass({ ...options, includePaths: [...includePaths] })\n            },\n        };\n        break;\n}\n\n/**\n * Info about templater\n * @type {String}   templater.name\n * @type {String}   templater.ext\n * @type {Function} templater.fn\n */\nswitch (templaterName) {\n    case 'handlebars':\n        tars.packages.handlebars = tars.require('gulp-compile-handlebars').Handlebars;\n        tars.templater = {\n            name: 'handlebars',\n            ext: '{html,hbs}',\n            fn: (mocksData) =>\n                tars.require('gulp-compile-handlebars')(\n                    mocksData,\n                    Object.assign({}, tars.pluginsConfig['gulp-compile-handlebars'], {\n                        helpers: require('./tasks/html/helpers/handlebars-helpers'),\n                    }),\n                ),\n        };\n        break;\n    case 'jade':\n        tars.templater = {\n            name: 'jade',\n            ext: 'jade',\n            fn: (mocksData) =>\n                tars.require('gulp-jade')(\n                    Object.assign({}, tars.pluginsConfig['gulp-jade'], {\n                        locals: mocksData,\n                    }),\n                ),\n        };\n        break;\n    case 'pug':\n    default:\n        tars.templater = {\n            name: 'pug',\n            ext: 'pug',\n            fn: (mocksData) =>\n                tars.require('gulp-pug')(\n                    Object.assign({}, tars.pluginsConfig['gulp-pug'], {\n                        locals: mocksData,\n                    }),\n                ),\n        };\n        break;\n}\n"
  },
  {
    "path": "tars/tasks/css/compile-css-for-ie8.js",
    "content": "'use strict';\n\n/**\n * Styles compilation for IE8\n */\nmodule.exports = () => {\n    return tars.packages.gulp.task('css:compile-css-for-ie8', done => {\n        if (tars.flags.ie8 || tars.flags.ie) {\n            return require(`${tars.root}/tasks/css/helpers/${tars.config.css.workflow}-compile-css-task-template`)('ie8');\n        }\n\n        tars.skipTaskLog('css:compile-css-for-ie8', 'Stylies for IE8 are not used');\n        done(null);\n    });\n};\n"
  },
  {
    "path": "tars/tasks/css/compile-css-for-ie9.js",
    "content": "'use strict';\n\n/**\n * Styles compilation for IE9\n */\nmodule.exports = () => {\n    return tars.packages.gulp.task('css:compile-css-for-ie9', done => {\n        if (tars.flags.ie9 || tars.flags.ie) {\n            return require(`${tars.root}/tasks/css/helpers/${tars.config.css.workflow}-compile-css-task-template`)('ie9');\n        }\n\n        tars.skipTaskLog('css:compile-css-for-ie9', 'Stylies for IE9 are not used');\n        done(null);\n    });\n};\n"
  },
  {
    "path": "tars/tasks/css/compile-css.js",
    "content": "'use strict';\n\n/**\n * Styles compilation\n */\nmodule.exports = () => {\n    return tars.packages.gulp.task('css:compile-css', () => {\n        return require(`${tars.root}/tasks/css/helpers/${tars.config.css.workflow}-compile-css-task-template`)();\n    });\n};\n"
  },
  {
    "path": "tars/tasks/css/compress-css.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst rename = tars.packages.rename;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\n\n/**\n * Compress css-files\n */\nmodule.exports = () => {\n    return gulp.task('css:compress-css', () => {\n        return gulp.src(`${tars.options.build.path}${tars.config.fs.staticFolderName}/css/*.css`)\n            .pipe(plumber({\n                errorHandler(error) {\n                    notifier.error('An error occurred while compressing css.', error);\n                }\n            }))\n            .pipe(tars.require('gulp-csso')(tars.pluginsConfig['gulp-csso']))\n            .pipe(rename({\n                suffix: '.min'\n            }))\n            .pipe(gulp.dest(`${tars.options.build.path}${tars.config.fs.staticFolderName}/css/`))\n            .pipe(\n                notifier.success('Css\\'ve been minified')\n            );\n    });\n};\n"
  },
  {
    "path": "tars/tasks/css/helpers/actions-on-sprite-task-skipping.js",
    "content": "const notifier = tars.helpers.notifier;\nconst fs = require('fs');\n\n/**\n * Create files with mixins, when you do not have images for sprites\n * @param  {Object} params\n */\nmodule.exports = function actionsOnSpriteTaskSkipping(params) {\n    const blankFilePath = params.blankFilePath;\n    const fileWithMixinsPath = params.fileWithMixinsPath;\n    const doneCallback = params.done;\n    const errorText = params.errorText;\n\n    Promise.resolve()\n        .then(() => {\n            return new Promise((resolve, reject) => {\n                fs.readFile(fileWithMixinsPath, 'utf8', (error, data) => {\n                    if (error) {\n                        return reject(error);\n                    }\n\n                    return resolve(data);\n                });\n            });\n        })\n        .then(mixinsContent => {\n            return new Promise((resolve, reject) => {\n                fs.writeFile(blankFilePath, mixinsContent, error => {\n                    if (error) {\n                        return reject(error);\n                    }\n\n                    resolve();\n                });\n            });\n        })\n        .then(() => doneCallback(null))\n        .catch(error => {\n            doneCallback(error);\n            return notifier.error(errorText, error);\n        });\n};\n"
  },
  {
    "path": "tars/tasks/css/helpers/concat-compile-css-task-template.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst gulpif = tars.packages.gulpif;\nconst concat = tars.packages.concat;\nconst autoprefixer = tars.packages.autoprefixer;\nconst importify = tars.packages.importify;\nconst postcss = tars.packages.postcss;\nconst replace = tars.packages.replace;\nconst sourcemaps = tars.packages.sourcemaps;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\nconst browserSync = tars.packages.browserSync;\nconst stringHelper = tars.helpers.stringHelper;\n\nmodule.exports = function generateTaskContent(browser) {\n    browser = browser || '';\n\n    const preprocExtensions = tars.cssPreproc.ext;\n    const preprocName = tars.cssPreproc.name;\n    const capitalizePreprocName = stringHelper.capitalizeFirstLetter(preprocName);\n    const stylesFolderPath = `./markup/${tars.config.fs.staticFolderName}/${preprocName}`;\n    const sourceMapsDest = tars.config.sourcemaps.css.inline ? '' : '.';\n\n    let successMessage = `${capitalizePreprocName}-files have been compiled`;\n    let errorMessage = 'An error occurred while compiling css';\n    let compiledFileName = 'main';\n    let generateSourceMaps = false;\n\n    let postProcessors = [];\n    let stylesFilesToConcatinate = [];\n    let stylesFilesToIgnore = [\n        `${stylesFolderPath}/entry/**/*.${preprocExtensions}`,\n        `${stylesFolderPath}/entry/**/*.css`,\n        `./**/_*.${preprocExtensions}`,\n        './**/_*.css',\n    ];\n    let firstStylesFilesToConcatinate = [\n        `${stylesFolderPath}/normalize.${preprocExtensions}`,\n        `${stylesFolderPath}/libraries/**/*.${preprocExtensions}`,\n        `${stylesFolderPath}/libraries/**/*.css`,\n        `${stylesFolderPath}/mixins.${preprocExtensions}`,\n        `${stylesFolderPath}/sprites-${preprocName}/sprite_96.${preprocExtensions}`,\n    ];\n    const generalStylesFilesToConcatinate = [\n        `${stylesFolderPath}/fonts.${preprocExtensions}`,\n        `${stylesFolderPath}/vars.${preprocExtensions}`,\n        `${stylesFolderPath}/GUI.${preprocExtensions}`,\n        `${stylesFolderPath}/common.${preprocExtensions}`,\n        `${stylesFolderPath}/plugins/**/*.${preprocExtensions}`,\n        `${stylesFolderPath}/plugins/**/*.css`,\n        `./markup/${tars.config.fs.componentsFolderName}/**/*.${preprocExtensions}`,\n        `./markup/${tars.config.fs.componentsFolderName}/**/*.css`,\n    ];\n    const lastStylesFilesToConcatinate = [\n        `${stylesFolderPath}/etc/**/*.${preprocExtensions}`,\n        `${stylesFolderPath}/etc/**/*.css`,\n    ];\n\n    if (tars.config.postcss && tars.config.postcss.length) {\n        tars.config.postcss.forEach((postProcessor) => {\n            postProcessors.push(require(postProcessor.name)(postProcessor.options));\n        });\n    }\n\n    if (preprocName === 'less' || preprocName === 'stylus') {\n        firstStylesFilesToConcatinate.push(\n            `${stylesFolderPath}/sprites-${preprocName}/sprite-png.${preprocExtensions}`,\n        );\n    }\n\n    switch (browser) {\n        case 'ie8':\n            stylesFilesToConcatinate.push(\n                firstStylesFilesToConcatinate,\n                `${stylesFolderPath}/sprites-${preprocName}/svg-fallback-sprite.${preprocExtensions}`,\n                `${stylesFolderPath}/sprites-${preprocName}/sprite-ie.${preprocExtensions}`,\n                generalStylesFilesToConcatinate,\n                `./markup/${tars.config.fs.componentsFolderName}/**/ie/ie8.${preprocExtensions}`,\n                `./markup/${tars.config.fs.componentsFolderName}/**/ie/ie8.css`,\n                lastStylesFilesToConcatinate,\n            );\n            stylesFilesToIgnore.push(\n                `./markup/${tars.config.fs.componentsFolderName}/**/ie/ie9.${preprocExtensions}`,\n                `./markup/${tars.config.fs.componentsFolderName}/**/ie/ie9.css`,\n            );\n\n            postProcessors.push(autoprefixer({ browsers: ['ie 8'] }));\n\n            generateSourceMaps = false;\n\n            compiledFileName += `_${browser}`;\n\n            successMessage = `${capitalizePreprocName}-files for IE8 have been compiled`;\n            errorMessage = 'An error occurred while compiling css for IE8.';\n\n            break;\n        case 'ie9':\n            stylesFilesToConcatinate.push(firstStylesFilesToConcatinate);\n\n            if (tars.config.svg.active && tars.config.svg.workflow === 'sprite') {\n                stylesFilesToConcatinate.push(\n                    `${stylesFolderPath}/sprites-${preprocName}/svg-sprite.${preprocExtensions}`,\n                );\n            }\n\n            stylesFilesToConcatinate.push(\n                generalStylesFilesToConcatinate,\n                `./markup/${tars.config.fs.componentsFolderName}/**/ie/ie9.${preprocExtensions}`,\n                `./markup/${tars.config.fs.componentsFolderName}/**/ie/ie9.css`,\n                lastStylesFilesToConcatinate,\n            );\n\n            stylesFilesToIgnore.push(\n                `./markup/${tars.config.fs.componentsFolderName}/**/ie/ie8.${preprocExtensions}`,\n                `./markup/${tars.config.fs.componentsFolderName}/**/ie/ie8.css`,\n            );\n\n            postProcessors.push(autoprefixer({ browsers: ['ie 9'] }));\n\n            compiledFileName += `_${browser}`;\n\n            generateSourceMaps = false;\n\n            successMessage = `${capitalizePreprocName}-files for IE9 have been compiled`;\n            errorMessage = 'An error occurred while compiling css for IE9.';\n\n            break;\n        // Styles for all browsers except IE8, IE9\n        default:\n            stylesFilesToConcatinate.push(firstStylesFilesToConcatinate);\n\n            if (tars.config.svg.active && tars.config.svg.workflow === 'sprite') {\n                stylesFilesToConcatinate.push(\n                    `${stylesFolderPath}/sprites-${preprocName}/svg-sprite.${preprocExtensions}`,\n                );\n            }\n\n            stylesFilesToIgnore.push(\n                `./markup/${tars.config.fs.componentsFolderName}/**/ie/ie9.${preprocExtensions}`,\n                `./markup/${tars.config.fs.componentsFolderName}/**/ie/ie9.css`,\n                `./markup/${tars.config.fs.componentsFolderName}/**/ie/ie8.${preprocExtensions}`,\n                `./markup/${tars.config.fs.componentsFolderName}/**/ie/ie8.css`,\n            );\n\n            stylesFilesToConcatinate.push(generalStylesFilesToConcatinate, lastStylesFilesToConcatinate);\n\n            postProcessors.push(autoprefixer());\n\n            generateSourceMaps = tars.config.sourcemaps.css.active && tars.options.watch.isActive;\n\n            break;\n    }\n\n    stylesFilesToConcatinate = [].concat.apply([], stylesFilesToConcatinate);\n\n    return gulp\n        .src(stylesFilesToConcatinate, { base: process.cwd(), ignore: stylesFilesToIgnore })\n        .pipe(gulpif(generateSourceMaps, sourcemaps.init()))\n        .pipe(\n            plumber({\n                errorHandler(error) {\n                    notifier.error(errorMessage, error);\n                    this.emit('end');\n                },\n            }),\n        )\n        .pipe(\n            importify(compiledFileName + '.' + tars.cssPreproc.mainExt, {\n                cssPreproc: preprocName,\n            }),\n        )\n        .pipe(tars.cssPreproc.preprocessor())\n        .pipe(\n            replace({\n                patterns: [\n                    {\n                        match: /%=staticPrefixForCss=%|%=static=%|__static__/gim,\n                        replacement: tars.config.staticPrefixForCss,\n                    },\n                ],\n                usePrefix: false,\n            }),\n        )\n        .pipe(postcss(postProcessors))\n        .pipe(concat(`${compiledFileName}${tars.options.build.hash}.css`))\n        .pipe(gulpif(generateSourceMaps, sourcemaps.write(sourceMapsDest)))\n        .pipe(gulp.dest(`${tars.config.devPath}${tars.config.fs.staticFolderName}/css/`))\n        .pipe(browserSync.reload({ stream: true, match: '**/*.css' }))\n        .pipe(notifier.success(successMessage));\n};\n"
  },
  {
    "path": "tars/tasks/css/helpers/manual-compile-css-task-template.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst gulpif = tars.packages.gulpif;\nconst rename = tars.packages.rename;\nconst autoprefixer = tars.packages.autoprefixer;\nconst postcss = tars.packages.postcss;\nconst replace = tars.packages.replace;\nconst sourcemaps = tars.packages.sourcemaps;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\nconst browserSync = tars.packages.browserSync;\nconst stringHelper = tars.helpers.stringHelper;\n\nmodule.exports = function generateTaskContent(browser) {\n    browser = browser || '';\n\n    const preprocExtensions = tars.cssPreproc.ext;\n    const preprocName = tars.cssPreproc.name;\n    const capitalizePreprocName = stringHelper.capitalizeFirstLetter(preprocName);\n    const stylesFolderPath = `./markup/${tars.config.fs.staticFolderName}/${preprocName}`;\n    const sourceMapsDest = tars.config.sourcemaps.css.inline ? '' : '.';\n    let successMessage = `${capitalizePreprocName}-files have been compiled`;\n    let errorMessage = 'An error occurred while compiling css';\n    let generateSourceMaps = false;\n\n    let postProcessors = [];\n    let stylesFilesToCompile = [];\n    let stylesFilesToIgnore = [`./**/_*.${preprocExtensions}`, './**/_*.css'];\n\n    if (tars.config.postcss && tars.config.postcss.length) {\n        tars.config.postcss.forEach((postProcessor) => {\n            postProcessors.push(require(postProcessor.name)(postProcessor.options));\n        });\n    }\n    switch (browser) {\n        case 'ie8':\n            stylesFilesToCompile.push(`${stylesFolderPath}/entry/ie/*_ie8.${preprocExtensions}`);\n\n            postProcessors.push(autoprefixer({ browsers: ['ie 8'] }));\n\n            generateSourceMaps = false;\n            successMessage = `${capitalizePreprocName}-files for IE8 have been compiled`;\n            errorMessage = 'An error occurred while compiling css for IE8.';\n            break;\n        case 'ie9':\n            stylesFilesToCompile.push(`${stylesFolderPath}/entry/ie/*_ie9.${preprocExtensions}`);\n\n            postProcessors.push(autoprefixer({ browsers: ['ie 9'] }));\n\n            generateSourceMaps = false;\n            successMessage = `${capitalizePreprocName}-files for IE9 have been compiled`;\n            errorMessage = 'An error occurred while compiling css for IE9.';\n            break;\n        // Styles for all browsers except IE8, IE9\n        default:\n            stylesFilesToCompile.push(`${stylesFolderPath}/entry/*.${preprocExtensions}`);\n\n            postProcessors.push(autoprefixer());\n\n            generateSourceMaps = tars.config.sourcemaps.css.active && tars.options.watch.isActive;\n            break;\n    }\n\n    return gulp\n        .src(stylesFilesToCompile, {\n            ignore: stylesFilesToIgnore,\n        })\n        .pipe(gulpif(generateSourceMaps, sourcemaps.init()))\n        .pipe(\n            plumber({\n                errorHandler(error) {\n                    notifier.error(errorMessage, error);\n                    this.emit('end');\n                },\n            }),\n        )\n        .pipe(tars.cssPreproc.preprocessor())\n        .pipe(\n            replace({\n                patterns: [\n                    {\n                        match: /%=staticPrefixForCss=%|%=static=%|__static__/gim,\n                        replacement: tars.config.staticPrefixForCss,\n                    },\n                ],\n                usePrefix: false,\n            }),\n        )\n        .pipe(postcss(postProcessors))\n        .pipe(rename({ suffix: tars.options.build.hash }))\n        .pipe(gulpif(generateSourceMaps, sourcemaps.write(sourceMapsDest)))\n        .pipe(gulp.dest(`${tars.config.devPath}${tars.config.fs.staticFolderName}/css/`))\n        .pipe(browserSync.reload({ stream: true, match: '**/*.css' }))\n        .pipe(notifier.success(successMessage));\n};\n"
  },
  {
    "path": "tars/tasks/css/helpers/sprite-mixins/less-raster-sprite-mixins.less",
    "content": ".sprite-position(@sprite) {\n    @sprite-offset-x: ~`\"@{sprite}\".split(', ')[2]`;\n    @sprite-offset-y: ~`\"@{sprite}\".split(', ')[3]`;\n    background-position: @sprite-offset-x  @sprite-offset-y;\n}\n\n.sprite-image(@sprite) {\n    @sprite-image: ~`'%=static=%png-sprite/96dpi/' + \"@{sprite}\".split(', ')[8].replace(']', '').replace(/\\'/g, '')`;\n    background-image: url(@sprite-image);\n}\n\n.sprite-mixin-template(@sprite) {\n    .sprite-image(@sprite);\n    .sprite-position(@sprite);\n    width: ~`\"@{sprite}\".split(', ')[4]`;\n    height: ~`\"@{sprite}\".split(', ')[5]`;\n}\n\n.bg-template(@sprite, @repeat: no-repeat) {\n    .sprite-mixin-template(@sprite);\n    @sprite-total-width: ~`\"@{sprite}\".split(', ')[6]`;\n    @sprite-total-height: ~`\"@{sprite}\".split(', ')[7]`;\n    background-size: @sprite-total-width, @sprite-total-height;\n    background-repeat: @repeat;\n}\n\n.highDpiMedia(@sprite) {}\n"
  },
  {
    "path": "tars/tasks/css/helpers/sprite-mixins/less-svg-fallback-sprite-mixins.less",
    "content": ".svg-sprite-position(@svg-sprite) {\n    @svg-sprite-offset-x: ~`\"@{svg-sprite}\".split(', ')[2]`;\n    @svg-sprite-offset-y: ~`\"@{svg-sprite}\".split(', ')[3]`;\n    background-position: @svg-sprite-offset-x  @svg-sprite-offset-y;\n}\n\n.svg-sprite-image(@svg-sprite) {\n    @svg-sprite-image-url: ~`'../img/rastered-svg-sprite/' + \"@{svg-sprite}\".split(', ')[8].replace(']', '').replace(/\\'/g, '')`;\n    background-image: url(@svg-sprite-image-url);\n}\n\n.bg-svg(@svg-sprite, @repeat: no-repeat) {\n    .svg-sprite-image(@svg-sprite);\n    .svg-sprite-position(@svg-sprite);\n    width: ~`\"@{svg-sprite}\".split(', ')[4]`;\n    height: ~`\"@{svg-sprite}\".split(', ')[5]`;\n    background-repeat: @repeat;\n}\n"
  },
  {
    "path": "tars/tasks/css/helpers/sprite-mixins/less-svg-sprite-mixins.less",
    "content": ".svg-sprite-position(@svg-sprite) {\n    @svg-sprite-offset-x: ~`\"@{svg-sprite}\".split(', ')[0].replace('[', '')`;\n    @svg-sprite-offset-y: ~`\"@{svg-sprite}\".split(', ')[1]`;\n    background-position: @svg-sprite-offset-x  @svg-sprite-offset-y;\n}\n\n.bg-svg(@svg-sprite, @repeat: no-repeat) {\n    background-image: url('%=static=%svg-sprite/{{imgName}}');\n    .svg-sprite-position(@svg-sprite);\n    width: ~`\"@{svg-sprite}\".split(', ')[2]`;\n    height: ~`\"@{svg-sprite}\".split(', ')[3]`;\n    background-repeat: @repeat;\n}\n"
  },
  {
    "path": "tars/tasks/css/helpers/sprite-mixins/scss-raster-sprite-mixins.scss",
    "content": "@mixin sprite-position($sprite) {\n    $sprite-offset-x: nth($sprite, 3);\n    $sprite-offset-y: nth($sprite, 4);\n    background-position: $sprite-offset-x  $sprite-offset-y;\n}\n\n@mixin sprite-image($sprite) {\n    $sprite-image: nth($sprite, 9);\n    background-image: url(%=static=%png-sprite/96dpi/#{$sprite-image});\n}\n\n@mixin sprite-mixin-template($sprite) {\n    @include sprite-image($sprite);\n    @include sprite-position($sprite);\n    width: nth($sprite, 5);\n    height: nth($sprite, 6);\n}\n\n@mixin bg($sprite, $repeat: no-repeat) {\n    @include sprite-mixin-template($sprite);\n    $sprite-total-width: nth($sprite, 7);\n    $sprite-total-height: nth($sprite, 8);\n    background-size: $sprite-total-width, $sprite-total-height;\n    background-repeat: $repeat;\n}\n"
  },
  {
    "path": "tars/tasks/css/helpers/sprite-mixins/scss-svg-fallback-sprite-mixins.scss",
    "content": "@mixin svg-sprite-position($svg-sprite) {\n    $svg-sprite-offset-x: nth($svg-sprite, 3);\n    $svg-sprite-offset-y: nth($svg-sprite, 4);\n    background-position: $svg-sprite-offset-x  $svg-sprite-offset-y;\n}\n\n@mixin svg-sprite-image($svg-sprite) {\n    $svg-sprite-image: nth($svg-sprite, 9);\n    background-image: url(%=static=%rastered-svg-sprite/#{$svg-sprite-image});\n}\n\n@mixin bg-svg($svg-sprite, $repeat: no-repeat) {\n    @include svg-sprite-image($svg-sprite);\n    @include svg-sprite-position($svg-sprite);\n    width: nth($svg-sprite, 5);\n    height: nth($svg-sprite, 6);\n    background-repeat: $repeat;\n}\n"
  },
  {
    "path": "tars/tasks/css/helpers/sprite-mixins/scss-svg-sprite-mixins.scss",
    "content": "@mixin svg-sprite-position($svg-sprite) {\n    $svg-sprite-offset-x: nth($svg-sprite, 1);\n    $svg-sprite-offset-y: nth($svg-sprite, 2);\n    background-position: $svg-sprite-offset-x  $svg-sprite-offset-y;\n}\n\n@mixin bg-svg($svg-sprite, $repeat: no-repeat) {\n    background-image: url('%=static=%svg-sprite/{{imgName}}');\n    @include svg-sprite-position($svg-sprite);\n    width: nth($svg-sprite, 3);\n    height: nth($svg-sprite, 4);\n    background-repeat: $repeat;\n}\n"
  },
  {
    "path": "tars/tasks/css/helpers/sprite-mixins/stylus-raster-sprite-mixins.styl",
    "content": "bg-template($sprite, $repeat = no-repeat) {\n    width: $sprite[4];\n    height: $sprite[5];\n    background-position: $sprite[2] $sprite[3];\n    background-image: url('%=static=%png-sprite/96dpi/' + $sprite[8]);\n    background-size: $sprite[6] $sprite[7];\n    background-repeat: $repeat;\n}\n\nhighDpiMedia($sprite) {}\n"
  },
  {
    "path": "tars/tasks/css/helpers/sprite-mixins/stylus-svg-fallback-sprite-mixins.styl",
    "content": "svg-sprite-position($svg-sprite) {\n    $svg-sprite-offset-x = $svg-sprite[2];\n    $svg-sprite-offset-y = $svg-sprite[3];\n    background-position: $svg-sprite-offset-x  $svg-sprite-offset-y;\n}\n\nsvg-sprite-image($svg-sprite) {\n    background-image: url('%=static=%rastered-svg-sprite/' + $svg-sprite[8]);\n}\n\nbg-svg($svg-sprite, $repeat = no-repeat) {\n    svg-sprite-image($svg-sprite);\n    svg-sprite-position($svg-sprite);\n    width: $svg-sprite[4];\n    height: $svg-sprite[5];\n    background-repeat: $repeat;\n}\n"
  },
  {
    "path": "tars/tasks/css/helpers/sprite-mixins/stylus-svg-sprite-mixins.styl",
    "content": "svg-sprite-position($svg-sprite) {\n    $svg-sprite-offset-x = $svg-sprite[0];\n    $svg-sprite-offset-y = $svg-sprite[1];\n    background-position: $svg-sprite-offset-x  $svg-sprite-offset-y;\n}\n\nbg-svg($svg-sprite, $repeat = no-repeat) {\n    background-image: url('%=static=%svg-sprite/{{imgName}}');\n    svg-sprite-position($svg-sprite);\n    width: $svg-sprite[2];\n    height: $svg-sprite[3];\n    background-repeat: $repeat;\n}\n"
  },
  {
    "path": "tars/tasks/css/make-fallback-for-svg.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\nconst skipTaskWithEmptyPipe = tars.helpers.skipTaskWithEmptyPipe;\nconst stringHelper = tars.helpers.stringHelper;\n\nconst staticFolderName = tars.config.fs.staticFolderName;\nconst imagesFolderName = tars.config.fs.imagesFolderName;\nconst preprocExtension = tars.cssPreproc.mainExt;\nconst preprocName = tars.cssPreproc.name;\nconst actionsOnSpriteTaskSkipping = require(`${tars.root}/tasks/css/helpers/actions-on-sprite-task-skipping`);\n\n/**\n * Make sprite for svg-fallback and styles for this sprite\n * Return pipe with styles for sprite\n */\nmodule.exports = () => {\n    return gulp.task('css:make-fallback-for-svg', (done) => {\n        const errorText = 'An error occurred while making fallback for svg.';\n\n        function actionsOnTaskSkipping() {\n            return actionsOnSpriteTaskSkipping({\n                blankFilePath: `./markup/${staticFolderName}/${preprocName}/sprites-${preprocName}/svg-fallback-sprite.${preprocExtension}`,\n                fileWithMixinsPath: `${tars.root}/tasks/css/helpers/sprite-mixins/${preprocName}-svg-fallback-sprite-mixins.${preprocExtension}`,\n                errorText,\n                done,\n            });\n        }\n\n        if (\n            tars.config.svg.active &&\n            tars.config.svg.workflow === 'sprite' &&\n            (tars.flags.ie8 || tars.flags.ie)\n        ) {\n            const cssTemplatePath = `./markup/${staticFolderName}/${preprocName}/sprite-generator-templates`;\n            const spriteData = gulp\n                .src(\n                    `${tars.config.devPath}${staticFolderName}/${imagesFolderName}/rastered-svg-images/*.png`,\n                )\n                .pipe(\n                    plumber({\n                        errorHandler(error) {\n                            notifier.error(errorText, error);\n                        },\n                    }),\n                )\n                .pipe(skipTaskWithEmptyPipe('css:make-fallback-for-svg', actionsOnTaskSkipping))\n                .pipe(\n                    tars.require('gulp.spritesmith')(\n                        Object.assign(\n                            {},\n                            {\n                                imgName: `svg-fallback-sprite${tars.options.build.hash}.png`,\n                                cssName: `svg-fallback-sprite.${preprocExtension}`,\n                                algorithm: 'binary-tree',\n                                algorithmOpts: {\n                                    sort: false,\n                                },\n                                padding: 4,\n                                cssTemplate: `${cssTemplatePath}/${preprocName}.svg-fallback-sprite.mustache`,\n                            },\n                            tars.pluginsConfig['gulp.spritesmith']['svg-fallback'],\n                        ),\n                    ),\n                );\n\n            spriteData.img\n                .pipe(\n                    gulp.dest(\n                        `${tars.config.devPath}${staticFolderName}/${imagesFolderName}/rastered-svg-sprite/`,\n                    ),\n                )\n                .pipe(notifier.success('Sprite-img for svg is ready!'));\n\n            spriteData.css\n                .pipe(gulp.dest(`./markup/${staticFolderName}/${preprocName}/sprites-${preprocName}/`))\n                .pipe(\n                    notifier.success(\n                        `${stringHelper.capitalizeFirstLetter(preprocName)} for svg-sprite is ready`,\n                    ),\n                );\n\n            return spriteData;\n        }\n\n        tars.skipTaskLog('css:make-fallback-for-svg', 'Svg-fallback is not used');\n        actionsOnTaskSkipping();\n    });\n};\n"
  },
  {
    "path": "tars/tasks/css/make-sprite-for-svg.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\nconst skipTaskWithEmptyPipe = tars.helpers.skipTaskWithEmptyPipe;\nconst stringHelper = tars.helpers.stringHelper;\n\nconst preprocName = tars.cssPreproc.name;\nconst preprocExtension = tars.cssPreproc.mainExt;\nconst staticFolderName = tars.config.fs.staticFolderName;\nconst imagesFolderPath = `${tars.config.devPath}${staticFolderName}/${tars.config.fs.imagesFolderName}`;\nconst preprocFoldePath = `./markup/${staticFolderName}/${preprocName}`;\nconst actionsOnSpriteTaskSkipping = require(`${tars.root}/tasks/css/helpers/actions-on-sprite-task-skipping`);\n\n/**\n * Make sprite for svg and styles for this sprite\n * Return pipe with styles for sprite\n */\nmodule.exports = () => {\n    return gulp.task('css:make-sprite-for-svg', (done) => {\n        const errorText = 'An error occurred while making sprite for svg.';\n\n        function actionsOnTaskSkipping() {\n            return actionsOnSpriteTaskSkipping({\n                blankFilePath: `${preprocFoldePath}/sprites-${preprocName}/svg-sprite.${preprocExtension}`,\n                fileWithMixinsPath: `${tars.root}/tasks/css/helpers/sprite-mixins/${preprocName}-svg-sprite-mixins.${preprocExtension}`,\n                errorText,\n                done,\n            });\n        }\n\n        if (tars.config.svg.active && tars.config.svg.workflow === 'sprite') {\n            return gulp\n                .src(`${imagesFolderPath}/minified-svg/*.svg`)\n                .pipe(\n                    plumber({\n                        errorHandler(error) {\n                            notifier.error(errorText, error);\n                        },\n                    }),\n                )\n                .pipe(skipTaskWithEmptyPipe('css:make-sprite-for-svg', actionsOnTaskSkipping))\n                .pipe(\n                    tars.require('gulp-svg-spritesheet')(\n                        Object.assign(\n                            {},\n                            {\n                                cssPathSvg: '',\n                                templateSrc: `${preprocFoldePath}/sprite-generator-templates/${preprocName}.svg-sprite.mustache`,\n                                templateDest: `${preprocFoldePath}/sprites-${preprocName}/svg-sprite.${preprocExtension}`,\n                                imgName: `sprite${tars.options.build.hash}.svg`,\n                            },\n                            tars.pluginsConfig['gulp-svg-spritesheet'],\n                        ),\n                    ),\n                )\n                .pipe(gulp.dest(`${imagesFolderPath}/svg-sprite/sprite${tars.options.build.hash}.svg`))\n                .pipe(\n                    notifier.success(\n                        `${stringHelper.capitalizeFirstLetter(preprocName)} for svg-sprite is ready.`,\n                    ),\n                );\n        }\n\n        tars.skipTaskLog('css:make-sprite-for-svg', 'SVG is not used or you prefer symbols workflow');\n        actionsOnTaskSkipping();\n    });\n};\n"
  },
  {
    "path": "tars/tasks/css/make-sprite.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\nconst stringHelper = tars.helpers.stringHelper;\n\nconst staticFolderName = tars.config.fs.staticFolderName;\nconst imagesFolderName = tars.config.fs.imagesFolderName;\nconst usedDpiArray = tars.config.useImagesForDisplayWithDpi;\nconst preprocExtension = tars.cssPreproc.mainExt;\nconst preprocName = tars.cssPreproc.name;\nconst skipTaskWithEmptyPipe = tars.helpers.skipTaskWithEmptyPipe;\nconst actionsOnSpriteTaskSkipping = require(`${tars.root}/tasks/css/helpers/actions-on-sprite-task-skipping`);\n\n/**\n * Make sprite and styles for this sprite\n */\nmodule.exports = () => {\n    return gulp.task('css:make-sprite', (done) => {\n        const dpiLength = usedDpiArray.length;\n        const cssTemplatePath = `./markup/${staticFolderName}/${preprocName}/sprite-generator-templates`;\n        const spritesmithConfig = tars.pluginsConfig['gulp.spritesmith']['regular-raster-sprite'];\n        const errorText = 'An error occurred while making png-sprite.';\n\n        let spriteData = [];\n        let dpiConfig = {};\n\n        usedDpiArray.forEach((dpiValue) => {\n            dpiConfig[`dpi${dpiValue}`] = true;\n        });\n\n        function actionsOnTaskSkipping() {\n            return actionsOnSpriteTaskSkipping({\n                blankFilePath: `./markup/${staticFolderName}/${preprocName}/sprites-${preprocName}/sprite_96.${preprocExtension}`,\n                fileWithMixinsPath: `${tars.root}/tasks/css/helpers/sprite-mixins/${preprocName}-raster-sprite-mixins.${preprocExtension}`,\n                done,\n                errorText,\n            });\n        }\n\n        /* eslint-disable no-loop-func */\n\n        for (let i = 0; i < dpiLength; i++) {\n            spriteData.push(\n                gulp\n                    .src(\n                        `./markup/${staticFolderName}/${imagesFolderName}/sprite/${usedDpiArray[i]}dpi/*.png`,\n                    )\n                    .pipe(\n                        plumber({\n                            errorHandler(error) {\n                                notifier.error(errorText, error);\n                            },\n                        }),\n                    )\n                    .pipe(\n                        tars.require('gulp.spritesmith')(\n                            Object.assign(\n                                {},\n                                {\n                                    imgName: `sprite${tars.options.build.hash}.png`,\n                                    cssName: `sprite_${usedDpiArray[i]}.${preprocExtension}`,\n                                    algorithm: 'binary-tree',\n                                    algorithmOpts: {\n                                        sort: false,\n                                    },\n                                    cssOpts: dpiConfig,\n                                    padding: (i + 1) * 4,\n                                    cssTemplate: `${cssTemplatePath}/${preprocName}.sprite.mustache`,\n                                },\n                                spritesmithConfig,\n                                {\n                                    padding: (i + 1) * spritesmithConfig.padding,\n                                },\n                            ),\n                        ),\n                    ),\n            );\n\n            spriteData[i].img\n                .pipe(\n                    gulp.dest(\n                        `${tars.config.devPath}${staticFolderName}/${imagesFolderName}/png-sprite/${usedDpiArray[i]}dpi/`,\n                    ),\n                )\n                .pipe(notifier.success(`Sprite img with dpi = ${usedDpiArray[i]} is ready`));\n        }\n\n        /* eslint-enable no-loop-func */\n\n        // Returns css for dpi 96\n        return spriteData[0].css\n            .pipe(skipTaskWithEmptyPipe('css:make-sprite', actionsOnTaskSkipping))\n            .pipe(gulp.dest(`./markup/${staticFolderName}/${preprocName}/sprites-${preprocName}/`))\n            .pipe(\n                notifier.success(stringHelper.capitalizeFirstLetter(preprocName) + ' for sprites is ready'),\n            );\n    });\n};\n"
  },
  {
    "path": "tars/tasks/css/move-separate.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst cache = tars.packages.cache;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\n\nconst staticFolderName = tars.config.fs.staticFolderName;\n\n/**\n * Copy separate Css-files to dev directory\n */\nmodule.exports = () => {\n    return gulp.task('css:move-separate', () => {\n        return gulp.src(`./markup/${staticFolderName}/${tars.cssPreproc.name}/separate-css/**/*.css`)\n            .pipe(plumber({\n                errorHandler(error) {\n                    notifier.error('An error occurred while moving separate css-files.', error);\n                }\n            }))\n            .pipe(cache('separate-css'))\n            .pipe(gulp.dest(`${tars.config.devPath}${staticFolderName}/css/separate-css`))\n            .pipe(\n                notifier.success('Separate css files\\'s been copied')\n            );\n    });\n};\n"
  },
  {
    "path": "tars/tasks/html/compile-templates.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst replace = tars.packages.replace;\nconst plumber = tars.packages.plumber;\nconst rename = tars.packages.rename;\nconst through2 = tars.packages.through2;\nconst fs = require('fs');\nconst notifier = tars.helpers.notifier;\nconst browserSync = tars.packages.browserSync;\nconst generateStaticPath = require(`${tars.root}/tasks/html/helpers/generate-static-path`);\nconst templaterName = require(`${tars.root}/helpers/get-templater-name`)(tars.config.templater.toLowerCase());\nconst templaterIsPugOrJade = templaterName === 'jade' || templaterName === 'pug';\n\nlet patterns = [];\n\n/**\n * Traverse recursively through data-object\n * If any property is a funciton,\n * this function will be called\n * @param  {Object} obj      Current object to traverse in current step\n * @param  {Object} fullData Object with all data\n */\nfunction traverseThroughObject(obj, fullData) {\n    for (let property in obj) {\n        if (obj.hasOwnProperty(property)) {\n            if (typeof obj[property] === 'object') {\n                traverseThroughObject(obj[property], fullData);\n            }\n\n            if (typeof obj[property] === 'function') {\n                obj[property] = obj[property].call(null, fullData);\n            }\n        }\n    }\n}\n\n/**\n * Concat all data for all components to one file\n * @return {Object} Object with data for components\n */\nfunction concatComponentsData() {\n    let dataEntry;\n    let readyMocksData;\n\n    try {\n        dataEntry = fs.readFileSync(`${tars.config.devPath}temp/mocksData.js`, 'utf8');\n    } catch (er) {\n        dataEntry = false;\n    }\n\n    if (dataEntry) {\n        eval(`readyMocksData = {${dataEntry}}`);\n        // readyMocksData passed as second argument\n        // to be an argument for each function from data\n        traverseThroughObject(readyMocksData, readyMocksData);\n    } else {\n        readyMocksData = '{}';\n    }\n\n    // Add helpers for Jade and Pug into readyMocksData in case of using Jade as templater\n    if (templaterIsPugOrJade) {\n        readyMocksData = Object.assign(readyMocksData, {\n            [`${templaterName}Helpers`]: require(`${tars.root}/tasks/html/helpers/${templaterName}-helpers`)\n        });\n    }\n\n    return readyMocksData;\n}\n\nif (!tars.flags.ie8 && !tars.flags.ie) {\n    patterns.push(\n        {\n            match: /<!--\\[if IE 8.*endif\\]-->|<!--\\[if lt IE 9.*endif\\]-->/gm,\n            replacement: ''\n        }\n    );\n}\n\nif (!tars.flags.ie9 && !tars.flags.ie) {\n    patterns.push(\n        {\n            match: /<!--\\[if IE 9.*endif\\]-->/gm,\n            replacement: ''\n        }\n    );\n}\n\npatterns.push(\n    {\n        match: '%=min=%',\n        replacement: tars.flags.min || tars.flags.release || tars.flags.m ? '.min' : ''\n    }, {\n        match: '%=hash=%',\n        replacement: tars.flags.release ? tars.options.build.hash : ''\n    }\n);\n\nif (\n    tars.config.svg.active && tars.config.svg.workflow === 'symbols' &&\n    tars.config.svg.symbolsConfig.loadingType === 'inject'\n) {\n    patterns.push(\n        {\n            match: '%=symbols=%',\n            replacement: (() => {\n\n                /* eslint-disable no-unused-vars */\n\n                try {\n                    return fs.readFileSync(`${tars.config.devPath}temp/svg-symbols${tars.options.build.hash}.svg`, 'utf8');\n                } catch (error) {\n                    return '';\n                }\n\n                /* eslint-enable no-unused-vars */\n            })\n        }\n    );\n} else {\n    patterns.push(\n        {\n            match: '%=symbols=%',\n            replacement: ''\n        }\n    );\n}\n\nif (\n    !tars.config.svg.active || tars.config.svg.workflow !== 'symbols' ||\n    tars.config.svg.symbolsConfig.loadingType !== 'separate-file-with-link' ||\n    !tars.config.svg.symbolsConfig.usePolyfillForExternalSymbols\n) {\n    patterns.push(\n        {\n            match: '<script src=\"%=static=%js/separate-js/svg4everybody.min.js\"></script>',\n            replacement: ''\n        }, {\n            match: '<script>svg4everybody();</script>',\n            replacement: ''\n        }\n    );\n}\n\n/**\n * Add some specific functions for Jade/Pug-processing\n * @return {Pipe}\n */\nfunction jadeAndPugInheritanceProcessing() {\n    const inheritanceOptions = {\n        basedir: './markup/',\n        extension: `.${templaterName}`,\n        skip: ['node_modules']\n    };\n    const isInheritanceEnabled = tars.options.watch.isActive && templaterIsPugOrJade;\n\n    if (isInheritanceEnabled) {\n        return tars.packages.streamCombiner(\n            tars.packages.cache('templates'),\n            tars.require(`gulp-${templaterName}-inheritance`)(inheritanceOptions),\n            tars.helpers.filterFilesByPath([\n                new RegExp(`\\/markup\\/${tars.config.fs.componentsFolderName}\\/`),\n                /^_[\\w]+.(jade|pug)/\n            ])\n        );\n    }\n\n    return tars.packages.gutil.noop();\n}\n\n/**\n * HTML compilation of pages templates.\n * Templates with _ prefix won't be compiled\n */\nmodule.exports = () => {\n    return gulp.task('html:compile-templates', () => {\n        let mocksData;\n        let error;\n        let compileError;\n        let filesToCompile = [\n            `./markup/pages/**/*.${tars.templater.ext}`,\n            `!./markup/pages/**/_*.${tars.templater.ext}`\n        ];\n\n        if (templaterIsPugOrJade && tars.options.watch.isActive) {\n            filesToCompile.push(\n                `!./markup/${tars.config.fs.componentsFolderName}/**/_*.${tars.templater.ext}`,\n                `./markup/${tars.config.fs.componentsFolderName}/**/*.${tars.templater.ext}`\n            );\n        }\n\n        try {\n            mocksData = concatComponentsData();\n        } catch (er) {\n            error = er;\n            mocksData = false;\n        }\n\n        return gulp.src(filesToCompile)\n            .pipe(plumber({\n                errorHandler(pipeError) {\n                    notifier.error('An error occurred while compiling to html.', pipeError);\n                    this.emit('end');\n                    compileError = true;\n                }\n            }))\n            .pipe(jadeAndPugInheritanceProcessing())\n            .pipe(\n                mocksData\n                    ? tars.templater.fn(mocksData)\n                    : through2.obj(\n                        function () {\n                            /* eslint-disable no-invalid-this */\n\n                            this.emit('error', new Error('An error occurred with data-files!\\n' + error));\n\n                            /* eslint-enable no-invalid-this */\n                        }\n                    )\n            )\n            .pipe(replace({\n                patterns: patterns,\n                usePrefix: false\n            }))\n            .pipe(generateStaticPath())\n            .pipe(rename(pathToFileToRename => {\n\n                if (templaterIsPugOrJade) {\n                    pathToFileToRename.dirname = pathToFileToRename.dirname.replace(/^pages/, '');\n                }\n\n                pathToFileToRename.extname = '.html';\n            }))\n            .pipe(gulp.dest(`${tars.config.devPath}`))\n            .on('end', () => {\n                if (!compileError) {\n                    browserSync.reload();\n                    notifier.success('Templates\\'ve been compiled', { notStream: true });\n                }\n            });\n    });\n};\n"
  },
  {
    "path": "tars/tasks/html/concat-mocks-data.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst plumber = tars.packages.plumber;\nconst concat = tars.packages.concat;\nconst notifier = tars.helpers.notifier;\n\nconst pagesAndDataFilesProcessing = require(`${tars.root}/tasks/html/helpers/pages-and-data-files-processing`);\n\n/**\n * concat data for components and some other sources to one file\n */\nmodule.exports = () => {\n    return gulp.task('html:concat-mocks-data', () => {\n        return gulp\n            .src(\n                [\n                    `./markup/pages/**/*.${tars.templater.ext}`,\n                    `!./markup/pages/**/_*.${tars.templater.ext}`,\n                    `./markup/${tars.config.fs.componentsFolderName}/**/data/data.js`,\n                    `${tars.config.devPath}temp/symbols-data-template.js`,\n                ],\n                { allowEmpty: true },\n            )\n            .pipe(\n                plumber({\n                    errorHandler(error) {\n                        notifier.error(\n                            `An error occurred while concating ${tars.config.fs.componentsFolderName}'s data.`,\n                            error,\n                        );\n                    },\n                }),\n            )\n            .pipe(pagesAndDataFilesProcessing())\n            .pipe(concat('mocksData.js', { newLine: ',\\n\\n' }))\n            .pipe(gulp.dest(`${tars.config.devPath}temp/`))\n            .pipe(notifier.success(`Data for ${tars.config.fs.componentsFolderName} ready`));\n    });\n};\n"
  },
  {
    "path": "tars/tasks/html/helpers/generate-static-path.js",
    "content": "'use strict';\n\nconst through2 = tars.packages.through2;\nconst path = require('path');\nconst Buffer = require('buffer').Buffer;\n\n/**\n * Generate static path for pages\n */\nmodule.exports = function generateStaticPath() {\n\n    function getStaticPrefix(pageDepth) {\n        const staticPrefix = tars.config.fs.staticFolderName;\n\n        if (tars.useLiveReload) {\n            return `/${staticPrefix}/`;\n        }\n\n        if (tars.config.generateStaticPath) {\n            return `${pageDepth.join('')}${staticPrefix}/`;\n        }\n    }\n\n    return through2.obj(function (file, enc, callback) {\n        // Get all directories array for current page from page directory\n        const directoriesArray = path.parse(file.relative).dir.split(path.sep);\n        // Generate static path as '../' as many times, as directories array length + tars.config.staticPrefix\n        const pageDepth = directoriesArray.map(value => {\n            if (value) {\n                return '../';\n            }\n        });\n        let newPageContent = file.contents.toString();\n\n        newPageContent = newPageContent.replace(\n            /%=staticPrefix=%|%=static=%|__static__/g, getStaticPrefix(pageDepth)\n        );\n\n        if (tars.config.svg.active && tars.config.svg.workflow === 'symbols' &&\n            tars.config.svg.symbolsConfig.loadingType === 'separate-file-with-link') {\n            newPageContent = newPageContent.replace(\n                /xlink:href=\"(.*)\"/gim, (str, $1) => `xlink:href=\"${pageDepth.join('') + $1}\"`\n            );\n        }\n\n        file.contents = Buffer.from(newPageContent);\n\n        this.push(file); // eslint-disable-line no-invalid-this\n\n        return callback();\n    }, callback => callback());\n};\n"
  },
  {
    "path": "tars/tasks/html/helpers/handlebars-helpers.js",
    "content": "'use strict';\n\nconst Handlebars = tars.packages.handlebars;\n\nconst Dates = require('./utils/dates');\nconst Utils = require('./utils/utils');\n\nconst builtInHandlebarsHelpers = {\n    /**\n     * Repeat  helper\n     * @param  {Number} n       number of iterations\n     * @param  {[type]} options [description]\n     * @return {[type]}         [description]\n     */\n    repeat(n, options) {\n        options = options || {};\n\n        const count = n - 1;\n        let content = '';\n\n\n        for (let index = 0; index <= count; index++) {\n            options.data.index = index;\n            content += options.fn(this, { data: options.data });\n        }\n        return new Handlebars.SafeString(content);\n    },\n\n    /**\n     * If helper with params\n     * @param  {[type]} a        [description]\n     * @param  {[type]} b        [description]\n     * @param  {String} options  operation\n     * @return {[type]}          [description]\n     */\n    is(leftOperand, operation, rightOperand, options) {\n        const a = leftOperand || false;\n        const b = rightOperand || false;\n\n        if (operation && typeof operation === 'string') {\n            switch (operation) {\n\n                // Not strictly equal\n                case '==':\n                    if (a == b) {\n                        return options.fn(this);\n                    } else {\n                        return options.inverse(this);\n                    }\n                    break;\n\n                // Strictly equal\n                case '===':\n                    if (a === b) {\n                        return options.fn(this);\n                    } else {\n                        return options.inverse(this);\n                    }\n                    break;\n\n                // a > b checking\n                case '>':\n                    if (a > b) {\n                        return options.fn(this);\n                    } else {\n                        return options.inverse(this);\n                    }\n                    break;\n\n                // a >= b checking\n                case '>=':\n                    if (a >= b) {\n                        return options.fn(this);\n                    } else {\n                        return options.inverse(this);\n                    }\n                    break;\n\n                // a < b checking\n                case '<':\n                    if (a < b) {\n                        return options.fn(this);\n                    } else {\n                        return options.inverse(this);\n                    }\n                    break;\n\n                // a <= b checking\n                case '<=':\n                    if (a <= b) {\n                        return options.fn(this);\n                    } else {\n                        return options.inverse(this);\n                    }\n                    break;\n\n                // a != b checking\n                case '!=':\n                    if (a != b) {\n                        return options.fn(this);\n                    } else {\n                        return options.inverse(this);\n                    }\n                    break;\n\n                // a !== b checking\n                case '!==':\n                    if (a !== b) {\n                        return options.fn(this);\n                    } else {\n                        return options.inverse(this);\n                    }\n                    break;\n\n                // Action, if operation is unknown\n                default:\n                    throw new Error(\n                        'Operation is unknown!\\n\"is\" helper supports only:\\n' +\n                        '\"==\",\\n' +\n                        '\"===\",\\n' +\n                        '\">\",\\n' +\n                        '\">=\",\\n' +\n                        '\"<\",\\n' +\n                        '\"<=\",\\n' +\n                        '\"!=\",\\n' +\n                        '\"!==\",\\n'\n                    );\n            }\n        } else {\n            throw new Error('Operation has to be received to \"is\" helper and has to be a string');\n        }\n\n    },\n\n    /**\n     * Str to lower case\n     * @param  {String} str [description]\n     * @return {[type]}     [description]\n     */\n    toLowerCase(str) {\n        str = Utils.castToString(str);\n\n        return str.toLowerCase();\n    },\n\n    /**\n     * Str to upper case\n     * @param  {String} str [description]\n     * @return {[type]}     [description]\n     */\n    toUpperCase(str) {\n        str = Utils.castToString(str);\n\n        return str.toUpperCase();\n    },\n\n    /**\n     * Capitalize first symbol of str\n     * @param  {String} str [description]\n     * @return {[type]}     [description]\n     */\n    capitalizeFirst(str) {\n        str = Utils.castToString(str);\n\n        return str.charAt(0).toUpperCase() + str.slice(1);\n    },\n\n    /**\n     * Remove whitespaces from received data to helper\n     * @param  {[type]} options [description]\n     * @return {[type]}         [description]\n     */\n    strip(options) {\n        options = options || {};\n\n        let _data = {};\n\n        if (options._data) {\n            _data = Handlebars.createFrame(options._data);\n        }\n\n        const content = options.fn(this, {data: _data}).replace(/>(\\s+)</g, '><');\n\n        return new Handlebars.SafeString(content);\n    },\n\n    /**\n     * Create template for symbol including\n     * @param  {Object} options             Params for template\n     * @param  {String} options.iconName    The name of used icon\n     * @param  {String} options.className   Classname for svg element\n     * @param  {String} options.iconWidth   Width for svg element\n     * @param  {String} options.iconHeight  Height for svg element\n     * @return {String}                     Compiled Handlebars template\n     */\n    Icon(options) {\n        const iconName = options.hash.iconName;\n        let pathToSymbolsSprite = '';\n\n        if (!iconName) {\n            throw new Error('iconName has to be received to \"icon\" helper and has to be a string');\n        }\n\n        const iconData = options.data.root.__iconsData[iconName];\n        const symbolsConfig = tars.config.svg.symbolsConfig;\n        const symbolsSpriteFileName = `svg-symbols${tars.options.build.hash}.svg`;\n\n        if (!iconData) {\n            throw new Error('There is no icon with name: ' + iconName);\n        }\n\n        if (symbolsConfig.loadingType === 'separate-file-with-link') {\n            pathToSymbolsSprite = symbolsConfig.pathToExternalSymbolsFile + symbolsSpriteFileName;\n        }\n\n        pathToSymbolsSprite += '#' + iconName;\n\n        const className = options.hash.className || 'icon__' + iconName;\n        const iconWidth = options.hash.iconWidth || iconData.width;\n        const iconHeight = options.hash.iconHeight || iconData.height;\n        const content = `\n            <svg class=\"${className}\" width=\"${iconWidth}\" height=\"${iconHeight}\">\n                <use xlink:href=\"${pathToSymbolsSprite}\"></use>\n            </svg>\n        `;\n\n        return new Handlebars.SafeString(content);\n    },\n\n    /**\n     * {{formatDate}}\n     * Port of formatDate-js library (http://bit.ly/18eo2xw)\n     * @param  {[type]} date   [description]\n     * @param  {[type]} format [description]\n     * @return {[type]}        [description]\n    */\n    formatDate(date, format) {\n        return Dates.format(new Date(date), format);\n    },\n\n    /**\n     * {{now}}\n     * @param  {[type]} format [description]\n     * @return {[type]}        [description]\n     */\n    now(format) {\n        const date = new Date();\n\n        if (Utils.isUndefined(format)) {\n            return date;\n        } else {\n            return Dates.format(date, format);\n        }\n    },\n\n    /**\n     * {{i18n}}\n     * @author: Laurent Goderre <https://github.com/LaurentGoderrre>\n     * @param  {String} context\n     * @param  {Object} options\n     * @return {String}\n     * @example: <https://github.com/assemble/buttons> (See the \"button-i18n\" example)\n    */\n    i18n(context, options) {\n        let language = void 0;\n\n        if (typeof context !== 'string') {\n            throw 'Key must be of type \\'string\\'';\n        }\n\n        language = (typeof options.hash.language === 'string' ? options.hash.language : this.language);\n\n        if (typeof language === 'undefined') {\n            throw 'The \\'language\\' parameter is not defined';\n        }\n\n        if (typeof this[language] === \"undefined\") {\n            throw 'No strings found for language \\'\" + language + \"\\'';\n        }\n\n        if (typeof this[language][context] === \"undefined\") {\n            throw 'No string for key \\'\" + context + \"\\' for language \\'\" + language + \"\\'';\n        }\n\n        return this[language][context];\n    }\n};\n\nmodule.exports = Object.assign(\n    builtInHandlebarsHelpers,\n    require(tars.root + '/user-tasks/html/helpers/handlebars-helpers')\n);\n"
  },
  {
    "path": "tars/tasks/html/helpers/jade-helpers.js",
    "content": "'use strict';\n\nconst builtInPugHelpers = {\n\n    /**\n     * Icon helper for Jade\n     * It returns template for svg-symbols including\n     * @param  {Object} options\n     * @param  {String} options.iconName    Name of the used icon\n     * @param  {String} options.className   Classname for svg element\n     * @param  {String} options.iconWidth   Width for svg element\n     * @param  {String} options.iconHeight  Height for svg element\n     * @return {String}                     Ready template for svg-symbols including\n     */\n    Icon(options) {\n        const iconName = options.iconName;\n        let pathToSymbolsSprite = '';\n\n        if (!iconName) {\n            throw new Error('iconName has to be received to \"icon\" mixin and has to be a string');\n        }\n\n        const iconData = this.__iconsData[iconName];\n        const symbolsConfig = tars.config.svg.symbolsConfig;\n        const symbolsSpriteFileName = `svg-symbols${tars.options.build.hash}.svg`;\n\n        if (!iconData) {\n            throw new Error('There is no icon with name: ' + iconName);\n        }\n\n        if (symbolsConfig.loadingType === 'separate-file-with-link') {\n            pathToSymbolsSprite = symbolsConfig.pathToExternalSymbolsFile + symbolsSpriteFileName;\n        }\n\n        pathToSymbolsSprite += `#${iconName}`;\n\n        const className = options.className || `icon__${iconName}`;\n        const iconWidth = options.iconWidth || iconData.width;\n        const iconHeight = options.iconHeight || iconData.height;\n        return `\n            <svg class=\"${className}\" width=\"${iconWidth}\" height=\"${iconHeight}\">\n                <use xlink:href=\"${pathToSymbolsSprite}\"></use>\n            </svg>\n        `;\n    }\n};\n\nlet userHelpers;\n\ntry {\n    userHelpers = require(`${tars.root}/user-tasks/html/helpers/jade-helpers`);\n} catch (error) {\n    userHelpers = {};\n}\n\nmodule.exports = Object.assign(\n    builtInPugHelpers,\n    userHelpers\n);\n"
  },
  {
    "path": "tars/tasks/html/helpers/pages-and-data-files-processing.js",
    "content": "'use strict';\n\nconst through2 = tars.packages.through2;\nconst File = tars.packages.gutil.File;\nconst path = require('path');\nconst Buffer = require('buffer').Buffer;\nconst tarsEnvValue = process.env.TARS_ENV;\n\n/**\n * Strip 'const data = {' and '};' from data-file content or just remove last ;\n * @param  {String} content Content of data-file to processing\n * @return {String}         Processed data-file content\n */\nfunction dataFileProcessing(content) {\n    return content\n        .replace(/^[\\w\\s-]+?=\\s*?{\\s*([\\S\\s]*)\\s*}\\s*?;?$/m, '$1')\n        .replace(/^'([\\w\\s-]+)'/, '$1')\n        .replace(/;$/m, '');\n}\n\nmodule.exports = function pagesAndDataFilesProcessing() {\n    let hrefArray = [];\n    let pageNameArray = [];\n\n    return through2.obj(function (file, enc, callback) {\n        const parsedFileRelativePath = path.parse(file.relative);\n        const fileName = parsedFileRelativePath.base;\n        const pathParts = parsedFileRelativePath.dir.split(path.sep);\n        let fileContent = file.contents.toString();\n        let namePrefix = '';\n\n        if (pathParts.length > 2) {\n            namePrefix = pathParts.slice(0, -2).join('_') + '_';\n        }\n\n        switch (fileName) {\n            case 'data.js':\n                // Create new component name for ready data-file\n                fileContent = namePrefix + dataFileProcessing(fileContent);\n\n                // Add '' to ready component name\n                if (fileContent.search(/^([\\w\\s-]+)/) === 0) {\n                    fileContent = fileContent.replace(/^([\\w\\s-]+)/, '\\'$1\\'');\n                }\n\n                if (fileContent.replace(/\\s/g, '').length) {\n                    file.contents = Buffer.from(fileContent);\n                    this.push(file); // eslint-disable-line no-invalid-this\n                }\n                break;\n            case 'symbols-data-template.js':\n                this.push(file); // eslint-disable-line no-invalid-this\n                break;\n            default:\n                if (parsedFileRelativePath.dir) {\n                    parsedFileRelativePath.dir += '/';\n                }\n\n                hrefArray.push(`${parsedFileRelativePath.dir}${parsedFileRelativePath.name}.html`);\n                pageNameArray.push(parsedFileRelativePath.dir + parsedFileRelativePath.name);\n                break;\n        }\n\n        return callback();\n    }, function (callback) {\n        let pagesListFileContent = '__pages: [';\n\n        hrefArray.forEach((value, index) => {\n            if (index) {\n                pagesListFileContent += ',';\n            }\n\n            pagesListFileContent += `{\n                name: '${pageNameArray[index]}',\n                href: '${value}'\n             }`;\n        });\n        pagesListFileContent += ']';\n\n        const pagesListFile = new File({\n            base: './pages/',\n            cwd: __dirname,\n            path: './pages/all',\n            contents: Buffer.from(pagesListFileContent)\n        });\n\n        this.push(pagesListFile); // eslint-disable-line no-invalid-this\n\n        if (tarsEnvValue) {\n            this.push(new File({ // eslint-disable-line no-invalid-this\n                path: '.',\n                contents: Buffer.from(`TARS_ENV: '${tarsEnvValue}'`)\n            }));\n        }\n\n        return callback();\n    });\n};\n"
  },
  {
    "path": "tars/tasks/html/helpers/pug-helpers.js",
    "content": "'use strict';\n\nconst builtInPugHelpers = {\n\n    /**\n     * Icon helper for Jade\n     * It returns template for svg-symbols including\n     * @param  {Object} options\n     * @param  {String} options.iconName    Name of the used icon\n     * @param  {String} options.className   Classname for svg element\n     * @param  {String} options.iconWidth   Width for svg element\n     * @param  {String} options.iconHeight  Height for svg element\n     * @return {String}                     Ready template for svg-symbols including\n     */\n    Icon(options) {\n        const iconName = options.iconName;\n        let pathToSymbolsSprite = '';\n\n        if (!iconName) {\n            throw new Error('iconName has to be received to \"icon\" mixin and has to be a string');\n        }\n\n        if (!this.__iconsData) {\n            throw new Error('please, ensure that \"symbols\" is set in tars.config.svg.workflow');\n        }\n\n        const iconData = this.__iconsData[iconName];\n        const symbolsConfig = tars.config.svg.symbolsConfig;\n        const symbolsSpriteFileName = `svg-symbols${tars.options.build.hash}.svg`;\n\n        if (!iconData) {\n            throw new Error('There is no icon with name: ' + iconName);\n        }\n\n        if (symbolsConfig.loadingType === 'separate-file-with-link') {\n            pathToSymbolsSprite = symbolsConfig.pathToExternalSymbolsFile + symbolsSpriteFileName;\n        }\n\n        pathToSymbolsSprite += `#${iconName}`;\n\n        const className = options.className || `icon__${iconName}`;\n        const iconWidth = options.iconWidth || iconData.width;\n        const iconHeight = options.iconHeight || iconData.height;\n        return `\n            <svg class=\"${className}\" width=\"${iconWidth}\" height=\"${iconHeight}\">\n                <use xlink:href=\"${pathToSymbolsSprite}\"></use>\n            </svg>\n        `;\n    }\n};\n\nlet userHelpers;\n\ntry {\n    userHelpers = require(`${tars.root}/user-tasks/html/helpers/pug-helpers`);\n} catch (error) {\n    userHelpers = {};\n}\n\nmodule.exports = Object.assign(\n    builtInPugHelpers,\n    userHelpers\n);\n"
  },
  {
    "path": "tars/tasks/html/helpers/utils/dates.js",
    "content": "/**\n * Handlebars Helpers Utils\n * http://github.com/assemble/handlebars-helpers\n * Copyright (c) 2013 Jon Schlinkert, Brian Woodward, contributors\n * Licensed under the MIT License (MIT).\n */\n'use strict';\n\nvar Dates = module.exports = {};\n\nDates.padNumber = function(num, count, padCharacter) {\n\n    if (typeof padCharacter === 'undefined') {\n        padCharacter = '0';\n    }\n\n    var lenDiff = count - String(num).length;\n    var padding = '';\n\n    if (lenDiff > 0) {\n        while (lenDiff--) {\n            padding += padCharacter;\n        }\n    }\n    return padding + num;\n};\n\nDates.dayOfYear = function(date) {\n    var oneJan = new Date(date.getFullYear(), 0, 1);\n\n    return Math.ceil((date - oneJan) / 86400000);\n};\n\nDates.weekOfYear = function(date) {\n    var oneJan = new Date(date.getFullYear(), 0, 1);\n    return Math.ceil((((date - oneJan) / 86400000) + oneJan.getDay() + 1) / 7);\n};\n\nDates.isoWeekOfYear = function(date) {\n    var target = new Date(date.valueOf());\n    var dayNr = (date.getDay() + 6) % 7;\n    target.setDate(target.getDate() - dayNr + 3);\n    var jan4 = new Date(target.getFullYear(), 0, 4);\n    var dayDiff = (target - jan4) / 86400000;\n\n    return 1 + Math.ceil(dayDiff / 7);\n};\n\nDates.tweleveHour = function(date) {\n    if (date.getHours() > 12) {\n        return date.getHours() - 12;\n    }\n\n    return date.getHours();\n};\n\nDates.timeZoneOffset = function(date) {\n    var hoursDiff = -date.getTimezoneOffset() / 60;\n    var result = Dates.padNumber(Math.abs(hoursDiff), 4);\n\n    return (hoursDiff > 0 ? '+' : '-') + result;\n};\n\nDates.format = function(date, format) {\n    var match = null;\n    return format.replace(Dates.formats, function(m, p) {\n        switch (p) {\n            case 'a':\n                return Dates.abbreviatedWeekdays[date.getDay()];\n            case 'A':\n                return Dates.fullWeekdays[date.getDay()];\n            case 'b':\n                return Dates.abbreviatedMonths[date.getMonth()];\n            case 'B':\n                return Dates.fullMonths[date.getMonth()];\n            case 'c':\n                return date.toLocaleString();\n            case 'C':\n                return Math.round(date.getFullYear() / 100);\n            case 'd':\n                return Dates.padNumber(date.getDate(), 2);\n            case 'D':\n                return Dates.format(date, '%m/%d/%y');\n            case 'e':\n                return Dates.padNumber(date.getDate(), 2, ' ');\n            case 'F':\n                return Dates.format(date, '%Y-%m-%d');\n            case 'h':\n                return Dates.format(date, '%b');\n            case 'H':\n                return Dates.padNumber(date.getHours(), 2);\n            case 'I':\n                return Dates.padNumber(Dates.tweleveHour(date), 2);\n            case 'j':\n                return Dates.padNumber(Dates.dayOfYear(date), 3);\n            case 'k':\n                return Dates.padNumber(date.getHours(), 2, ' ');\n            case 'l':\n                return Dates.padNumber(Dates.tweleveHour(date), 2, ' ');\n            case 'L':\n                return Dates.padNumber(date.getMilliseconds(), 3);\n            case 'm':\n                return Dates.padNumber(date.getMonth() + 1, 2);\n            case 'M':\n                return Dates.padNumber(date.getMinutes(), 2);\n            case 'n':\n                return '\\n';\n            case 'p':\n                if (date.getHours() > 11) {\n                    return 'PM';\n                } else {\n                    return 'AM';\n                }\n                break;\n            case 'P':\n                return Dates.format(date, '%p').toLowerCase();\n            case 'r':\n                return Dates.format(date, '%I:%M:%S %p');\n            case 'R':\n                return Dates.format(date, '%H:%M');\n            case 's':\n                return date.getTime() / 1000;\n            case 'S':\n                return Dates.padNumber(date.getSeconds(), 2);\n            case 't':\n                return '\\t';\n            case 'T':\n                return Dates.format(date, '%H:%M:%S');\n            case 'u':\n                if (date.getDay() === 0) {\n                    return 7;\n                } else {\n                    return date.getDay();\n                }\n                break;\n            case 'U':\n                return Dates.padNumber(Dates.weekOfYear(date), 2);\n            case 'v':\n                return Dates.format(date, '%e-%b-%Y');\n            case 'V':\n                return Dates.padNumber(Dates.isoWeekOfYear(date), 2);\n            case 'W':\n                return Dates.padNumber(Dates.weekOfYear(date), 2);\n            case 'w':\n                return Dates.padNumber(date.getDay(), 2);\n            case 'x':\n                return date.toLocaleDateString();\n            case 'X':\n                return date.toLocaleTimeString();\n            case 'y':\n                return String(date.getFullYear()).substring(2);\n            case 'Y':\n                return date.getFullYear();\n            case 'z':\n                return Dates.timeZoneOffset(date);\n            default:\n                return match;\n        }\n    });\n};\n\nDates.formats = /%(a|A|b|B|c|C|d|D|e|F|h|H|I|j|k|l|L|m|M|n|p|P|r|R|s|S|t|T|u|U|v|V|W|w|x|X|y|Y|z)/g;\n\nDates.abbreviatedWeekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thur', 'Fri', 'Sat'];\nDates.fullWeekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nDates.abbreviatedMonths = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nDates.fullMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\n"
  },
  {
    "path": "tars/tasks/html/helpers/utils/utils.js",
    "content": "/**\n * Handlebars Helpers: Utils\n * http://github.com/assemble/handlebars-helpers\n * Copyright (c) 2013, 2014 Jon Schlinkert, Brian Woodward, contributors\n * Licensed under the MIT License (MIT).\n */\n'use strict';\n\nmodule.exports = {\n    isUndefined(value) {\n        return typeof value === 'undefined' || value.toString() === '[object Function]' || (value.hash != null);\n    },\n\n    castToString(value) {\n        if (typeof value !== 'string') {\n            value.toString();\n        }\n\n        return value;\n    }\n};\n"
  },
  {
    "path": "tars/tasks/html/modify-html.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst gulpif = tars.packages.gulpif;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\n\n/**\n * Minify HTML (optional task)\n */\nmodule.exports = () => {\n    return gulp.task('html:modify-html', () => {\n        const usersModifyOptions = require(tars.root + '/user-tasks/html/helpers/modify-options');\n        const minifyOpts = Object.assign(\n            tars.pluginsConfig['gulp-htmlmin'],\n            usersModifyOptions.minifyOpts\n        );\n        /* eslint-disable camelcase */\n        const prettifyOpts = Object.assign(\n            tars.pluginsConfig['gulp-html-prettify'],\n            usersModifyOptions.prettifyOpts\n        );\n        /* eslint-enable camelcase */\n\n        return gulp.src(`${tars.config.devPath}**/*.html`)\n            .pipe(plumber({\n                errorHandler(error) {\n                    notifier.error('An error occurred while processing compiled html-files.', error);\n                }\n            }))\n            .pipe(gulpif(\n                tars.config.minifyHtml,\n                tars.require('gulp-htmlmin')(minifyOpts),\n                tars.require('gulp-html-prettify')(prettifyOpts)\n            ))\n            .pipe(gulp.dest(`${tars.config.devPath}`))\n            .pipe(\n                notifier.success('Compiled html\\'ve been processed.')\n            );\n    });\n};\n"
  },
  {
    "path": "tars/tasks/images/helpers/symbols-data-template.js",
    "content": "__iconsData: {\n    <% _.forEach(icons, icon => { %>\n        '<%= icon.name %>': {\n            width: '<%= icon.width %>px',\n            height: '<%= icon.height %>px'\n        },\n    <% }); %>\n}\n"
  },
  {
    "path": "tars/tasks/images/make-symbols-sprite.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst gulpif = tars.packages.gulpif;\nconst rename = tars.packages.rename;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\nconst skipTaskWithEmptyPipe = tars.helpers.skipTaskWithEmptyPipe;\n\nconst svgImagesPath = `${tars.config.devPath}${tars.config.fs.staticFolderName}/${tars.config.fs.imagesFolderName}/minified-svg/`;\nlet readySymbolSpritePath = `${tars.config.devPath}${tars.config.svg.symbolsConfig.pathToExternalSymbolsFile}`;\n\nif (tars.config.svg.symbolsConfig.loadingType === 'inject') {\n    readySymbolSpritePath = `${tars.config.devPath}temp/`;\n}\n\n/**\n * Create svg-symbols sprite\n */\nmodule.exports = () => {\n    return gulp.task('images:make-symbols-sprite', (done) => {\n        if (tars.config.svg.active && tars.config.svg.workflow === 'symbols') {\n            return gulp\n                .src(`${svgImagesPath}**/*.svg`)\n                .pipe(\n                    plumber({\n                        errorHandler(error) {\n                            notifier.error('An error occurred while creating symbols sprite.', error);\n                        },\n                    }),\n                )\n                .pipe(skipTaskWithEmptyPipe('images:make-symbols-sprite', done))\n                .pipe(\n                    tars.require('gulp-svg-symbols')({\n                        templates: [\n                            `${tars.root}/tasks/images/helpers/svg-symbols.svg`,\n                            `${tars.root}/tasks/images/helpers/symbols-data-template.js`,\n                        ],\n                        transformData: (svg, defaultData) => {\n                            return {\n                                id: defaultData.id,\n                                width: svg.width,\n                                height: svg.height,\n                                name: svg.name,\n                            };\n                        },\n                    }),\n                )\n                .pipe(\n                    gulpif(\n                        /[.]svg$/,\n                        rename((spritePath) => {\n                            spritePath.basename += tars.options.build.hash;\n                        }),\n                    ),\n                )\n                .pipe(gulpif(/[.]svg$/, gulp.dest(readySymbolSpritePath)))\n                .pipe(gulpif(/[.]js$/, gulp.dest(`${tars.config.devPath}temp/`)))\n                .pipe(notifier.success(\"Symbols sprite's been created\"));\n        }\n\n        tars.skipTaskLog('images:make-symbols-sprite', 'SVG is not used or you prefer svg-sprite workflow');\n        done(null);\n    });\n};\n"
  },
  {
    "path": "tars/tasks/images/minify-images.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst changed = tars.packages.changed;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\n\nconst imagesFolderPath = `${tars.config.devPath}${tars.config.fs.staticFolderName}/${tars.config.fs.imagesFolderName}`;\n\n/**\n * Minify png and jpg images\n */\nmodule.exports = () => {\n    const imagemin = tars.require('gulp-imagemin');\n\n    return gulp.task('images:minify-images', () => {\n        return gulp.src(\n            /* eslint-disable indent */\n            [\n                `${imagesFolderPath}/**/*.{png,jpg,svg}`,\n                `!${imagesFolderPath}/minified-svg/*.svg`,\n                `!${imagesFolderPath}/**/svg-symbols${tars.options.build.hash}.svg`\n            ],\n            /* eslint-enable indent */\n            { base: process.cwd() + '/' }\n        )\n            .pipe(plumber({\n                errorHandler(error) {\n                    notifier.error('An error occurred while minifying all images.', error);\n                }\n            }))\n            .pipe(changed(imagesFolderPath))\n            .pipe(\n                imagemin([\n                    imagemin.jpegtran({ progressive: true }),\n                    imagemin.optipng({ optimizationLevel: 5 }),\n                    imagemin.svgo({\n                        plugins: [\n                            { cleanupIDs: false },\n                            { removeViewBox: false },\n                            { convertPathData: false },\n                            { mergePaths: false },\n                        ],\n                    })\n                ], {\n                    verbose: true\n                })\n            )\n            .pipe(gulp.dest('./'))\n            .pipe(\n                notifier.success('Rastered images\\'ve been minified')\n            );\n    });\n};\n"
  },
  {
    "path": "tars/tasks/images/minify-svg.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst changed = tars.packages.changed;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\n\nconst svgImagesPath = `${tars.config.fs.staticFolderName}/${tars.config.fs.imagesFolderName}`;\n\n/**\n * Minify svg-images (optional task)\n */\nmodule.exports = () => {\n    const imagemin = tars.require('gulp-imagemin');\n\n    return gulp.task('images:minify-svg', (done) => {\n        if (tars.config.svg.active) {\n            return gulp\n                .src(`./markup/${svgImagesPath}/svg/*.svg`)\n                .pipe(\n                    plumber({\n                        errorHandler(error) {\n                            notifier.error('An error occurred while minifying svg.', error);\n                        },\n                    })\n                )\n                .pipe(\n                    changed(`${tars.config.devPath}${svgImagesPath}/minified-svg`, {\n                        hasChanged: changed.compareLastModifiedTime,\n                        extension: '.svg',\n                    })\n                )\n                .pipe(\n                    imagemin([\n                        imagemin.svgo({\n                            plugins: [\n                                { cleanupIDs: false },\n                                { removeViewBox: false },\n                                { convertPathData: false },\n                                { mergePaths: false },\n                            ],\n                        })\n                    ])\n                )\n                .pipe(gulp.dest(`${tars.config.devPath}${svgImagesPath}/minified-svg/`))\n                .pipe(notifier.success('SVG\\'ve been minified'));\n        }\n\n        tars.skipTaskLog('images:minify-svg', 'SVG is not used');\n        done(null);\n    });\n};\n"
  },
  {
    "path": "tars/tasks/images/move-content-img.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst cache = tars.packages.cache;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\nconst browserSync = tars.packages.browserSync;\n\nconst contentImagesFolder = `${tars.config.fs.staticFolderName}/${tars.config.fs.imagesFolderName}/content`;\n\n/**\n * Move images for content\n */\nmodule.exports = () => {\n    return gulp.task('images:move-content-img', () => {\n        return gulp.src(\n                /* eslint-disable indent */\n                [\n                    `./markup/${contentImagesFolder}/**/*.*`,\n                    `!./markup/${contentImagesFolder}/**/*.tmp`\n                ]\n                /* eslint-enable indent */\n            )\n            .pipe(plumber({\n                errorHandler(error) {\n                    notifier.error('An error occurred while moving content images.', error);\n                }\n            }))\n            .pipe(cache('move-content-img'))\n            .pipe(gulp.dest(`${tars.config.devPath}${contentImagesFolder}`))\n            .pipe(browserSync.reload({ stream: true }))\n            .pipe(\n                notifier.success('Content images\\'ve been moved')\n            );\n    });\n};\n"
  },
  {
    "path": "tars/tasks/images/move-general-img.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst cache = tars.packages.cache;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\nconst browserSync = tars.packages.browserSync;\n\nconst generalImagesFolder = `${tars.config.fs.staticFolderName}/${tars.config.fs.imagesFolderName}/general`;\n\n/**\n * Move general images\n */\nmodule.exports = () => {\n    return gulp.task('images:move-general-img', () => {\n        return gulp.src(\n                /* eslint-disable indent */\n                [\n                    `./markup/${generalImagesFolder}/**/*.*`,\n                    `!./markup/${generalImagesFolder}/**/*.tmp`\n                ]\n                /* eslint-enable indent */\n            )\n            .pipe(plumber({\n                errorHandler(error) {\n                    notifier.error('An error occurred while moving general images.', error);\n                }\n            }))\n            .pipe(cache('move-general-img'))\n            .pipe(gulp.dest(`${tars.config.devPath}${generalImagesFolder}`))\n            .pipe(browserSync.reload({ stream: true }))\n            .pipe(\n                notifier.success('General images\\'ve been moved')\n            );\n    });\n};\n"
  },
  {
    "path": "tars/tasks/images/move-plugins-img.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst cache = tars.packages.cache;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\nconst browserSync = tars.packages.browserSync;\n\nconst pluginsImagesFolder = `${tars.config.fs.staticFolderName}/${tars.config.fs.imagesFolderName}/plugins`;\n\n/**\n * Move images for plugins\n */\nmodule.exports = () => {\n    return gulp.task('images:move-plugins-img', () => {\n        return gulp.src(\n                /* eslint-disable indent */\n                [\n                    `./markup/${pluginsImagesFolder}/**/*.*`,\n                    `!./markup/${pluginsImagesFolder}/**/*.tmp`\n                ]\n                /* eslint-enable indent */\n            )\n            .pipe(plumber({\n                errorHandler(error) {\n                    notifier.error('An error occurred while moving plugin\\'s imgs.', error);\n                }\n            }))\n            .pipe(cache('move-plugins-img'))\n            .pipe(gulp.dest(`${tars.config.devPath}${pluginsImagesFolder}`))\n            .pipe(browserSync.reload({ stream: true }))\n            .pipe(\n                notifier.success('Plugins\\' images\\'ve been moved')\n            );\n    });\n};\n"
  },
  {
    "path": "tars/tasks/images/raster-svg.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst cache = tars.packages.cache;\nconst changed = tars.packages.changed;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\n\nconst imagesPath = `${tars.config.fs.staticFolderName}/${tars.config.fs.imagesFolderName}`;\n\n/**\n * Raster SVG-files (optional task)\n */\nmodule.exports = () => {\n    return gulp.task('images:raster-svg', done => {\n\n        if (tars.config.svg.active && tars.config.svg.workflow === 'sprite' && (tars.flags.ie8 || tars.flags.ie)) {\n            return gulp.src(`./markup/${imagesPath}/svg/*.svg`)\n                .pipe(plumber({\n                    errorHandler(error) {\n                        notifier.error('An error occurred while rastering svg.', error);\n                    }\n                }))\n                .pipe(cache('raster-svg'))\n                .pipe(\n                    changed(\n                        `${imagesPath}/rastered-svg-images`,\n                        {\n                            hasChanged: changed.compareLastModifiedTime,\n                            extension: '.png'\n                        }\n                    )\n                )\n                .pipe(tars.require('gulp-svg2png')())\n                .pipe(gulp.dest(`${tars.config.devPath}${imagesPath}/rastered-svg-images`))\n                .pipe(\n                    notifier.success('SVG\\'ve been rastered')\n                );\n        }\n\n        tars.skipTaskLog('images:raster-svg', 'Rastering SVG is not used');\n        done(null);\n    });\n};\n"
  },
  {
    "path": "tars/tasks/js/check.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst cache = tars.packages.cache;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\n\nconst jsPathesToLint = [].concat.apply([], [\n    `./markup/${tars.config.fs.componentsFolderName}/**/*.js`,\n    `!./markup/${tars.config.fs.componentsFolderName}/**/_*.js`,\n    `!./markup/${tars.config.fs.componentsFolderName}/**/data/data.js`,\n    tars.config.js.lintJsCodeBeforeModules ? tars.config.js.jsPathsToConcatBeforeModulesJs : [],\n    tars.config.js.lintJsCodeAfterModules ? tars.config.js.jsPathsToConcatAfterModulesJs : []\n]);\n\n/**\n * Check JS for style and errors (optional task)\n */\nmodule.exports = () => {\n    return gulp.task('js:check', done => {\n\n        /* eslint-disable no-case-declarations */\n        if (tars.config.js.lint) {\n            switch (tars.config.js.workflow) {\n                case 'modular':\n                    switch (tars.config.js.bundler) {\n                        case 'webpack':\n                        default:\n                            tars.skipTaskLog('js:check', 'Code will be linted by built-in linter in bundler');\n                            return done(null);\n                    }\n                case 'concat':\n                default:\n                    const eslint = tars.require('gulp-eslint');\n\n                    return gulp.src(jsPathesToLint)\n                        .pipe(plumber({\n                            errorHandler() {\n                                notifier.error('An error occurred while checking js.');\n                            }\n                        }))\n                        .pipe(cache('eslint'))\n                        .pipe(eslint())\n                        .pipe(eslint.formatEach())\n                        .pipe(eslint.failAfterError());\n            }\n        }\n        /* eslint-enable no-case-declarations */\n\n        tars.skipTaskLog('js:check', 'JavaScript check is not used');\n        done(null);\n    });\n};\n"
  },
  {
    "path": "tars/tasks/js/concat-processing.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst concat = tars.packages.concat;\nconst streamCombiner = tars.packages.streamCombiner;\nconst plumber = tars.packages.plumber;\nconst gulpif = tars.packages.gulpif;\nconst rename = tars.packages.rename;\nconst sourcemaps = tars.packages.sourcemaps;\nconst notifier = tars.helpers.notifier;\nconst browserSync = tars.packages.browserSync;\nconst cwd = process.cwd();\nlet generateSourceMaps = false;\nconst staticFolderName = tars.config.fs.staticFolderName;\nconst destFolder = `${tars.config.devPath}${staticFolderName}/js`;\nconst compressJs = tars.flags.release || tars.flags.min || tars.flags.m;\nconst sourceMapsDest = tars.config.sourcemaps.js.inline ? '' : '.';\nconst jsPaths = [].concat.apply(\n    [],\n    [\n        `./markup/${staticFolderName}/js/framework/**/*.js`,\n        `./markup/${staticFolderName}/js/libraries/**/*.js`,\n        `./markup/${staticFolderName}/js/plugins/**/*.js`,\n        tars.config.js.jsPathsToConcatBeforeModulesJs,\n        `./markup/${tars.config.fs.componentsFolderName}/**/*.js`,\n        tars.config.js.jsPathsToConcatAfterModulesJs,\n    ],\n);\n\n/**\n * Stream of base processing with JavaScript.\n * ------------------------------------------\n * There are:\n *  - concat js files;\n *  - add hash like a suffix of filename;\n *  - write header in the start of main file;\n *  - write footer in the end of main file;\n *  - write source map;\n *  - write main file at fs.\n */\nfunction base() {\n    return streamCombiner(\n        gulpif(tars.config.js.useBabel, tars.require('gulp-babel')()),\n        concat({ cwd: cwd, path: 'main.js' }),\n        rename({ suffix: tars.options.build.hash }),\n        gulp.dest(destFolder),\n    );\n}\n\n/**\n * Stream of minimized with JavaScript.\n * ------------------------------------\n * There are:\n *  - removing `console.log()` and `debug`;\n *  - uglified code;\n *  - add '.min' suffix for main file;\n *  - write source maps;\n *  - write main file at fs.\n */\nfunction compress() {\n    if (compressJs) {\n        return streamCombiner(\n            tars.require('gulp-terser')(tars.pluginsConfig['gulp-terser']),\n            rename({ suffix: '.min' }),\n            gulp.dest(destFolder),\n        );\n    }\n\n    return tars.packages.gutil.noop();\n}\n\nmodule.exports = () => {\n    /**\n     * Task for processing with JavaScript files.\n     * ------------------------------------------\n     * There are:\n     *  - call lint task;\n     *  - prevent pipe breaking;\n     *  - creation of stream;\n     *  - init source maps;\n     *  - base processing;\n     *  - compress code;\n     *  - notify about end of task;\n     *  - reloading browser's page.\n     */\n    return gulp.task('js:concat-processing', () => {\n        generateSourceMaps = tars.config.sourcemaps.js.active && tars.options.watch.isActive;\n\n        return gulp\n            .src(jsPaths, {\n                base: cwd,\n                ignore: [\n                    `./markup/${tars.config.fs.componentsFolderName}/**/data/data.js`,\n                    './markup/**/_*.js',\n                    `./markup/${staticFolderName}/js/separate-js/**/*.js`,\n                ],\n            })\n            .pipe(\n                plumber({\n                    errorHandler(error) {\n                        notifier.error('An error occurred while processing js-files.', error);\n                    },\n                }),\n            )\n            .pipe(gulpif(generateSourceMaps, sourcemaps.init()))\n            .pipe(base())\n            .pipe(compress())\n            .pipe(gulpif(generateSourceMaps, sourcemaps.write(sourceMapsDest)))\n            .pipe(notifier.success('JavaScript has been processed'))\n            .pipe(browserSync.reload({ stream: true }));\n    });\n};\n"
  },
  {
    "path": "tars/tasks/js/helpers/separate-files-filter.js",
    "content": "'use strict';\n\nconst through2 = tars.packages.through2;\nconst path = require('path');\n\n/**\n * Filter files for move-separate js\n */\nmodule.exports = function separateFilesFilter() {\n\n    return through2.obj(function (file, enc, callback) {\n        const fileName = path.basename(file.relative);\n\n        switch (fileName) {\n            case 'html5shiv-3.7.2.min.js':\n                if (tars.flags.ie || tars.flags.ie8) {\n                    this.push(file); // eslint-disable-line no-invalid-this\n                }\n                break;\n            case 'svg4everybody.min.js':\n                if (\n                    tars.config.svg.active && tars.config.svg.workflow === 'symbols' &&\n                    tars.config.svg.symbolsConfig.loadingType === 'separate-file-with-link' &&\n                    tars.config.svg.symbolsConfig.usePolyfillForExternalSymbols\n                ) {\n                    this.push(file); // eslint-disable-line no-invalid-this\n                }\n                break;\n            default:\n                this.push(file); // eslint-disable-line no-invalid-this\n                break;\n        }\n\n        return callback();\n    }, callback => callback());\n};\n"
  },
  {
    "path": "tars/tasks/js/move-separate.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst cache = tars.packages.cache;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\n\nconst separateFilesFilter = require(`${tars.root}/tasks/js/helpers/separate-files-filter`);\nconst separateJsFilesPath = `${tars.config.fs.staticFolderName}/js/separate-js`;\n\n/**\n * Copy separate Js-files to dev directory\n */\nmodule.exports = () => {\n    return gulp.task('js:move-separate', () => {\n        return gulp.src(`./markup/${separateJsFilesPath}/**/*.js`)\n            .pipe(plumber({\n                errorHandler(error) {\n                    notifier.error('An error occurred while moving separate js-files.', error);\n                }\n            }))\n            .pipe(separateFilesFilter())\n            .pipe(cache('separate-js'))\n            .pipe(gulp.dest(`${tars.config.devPath}${separateJsFilesPath}`))\n            .pipe(\n                notifier.success('Separate js files\\'s been copied')\n            );\n    });\n};\n"
  },
  {
    "path": "tars/tasks/js/processing.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\n\nmodule.exports = () => {\n    return gulp.task(\n        'js:processing',\n        gulp.series('js:check', (done) => {\n            switch (tars.config.js.workflow) {\n                case 'modular':\n                    // It is not necessary to start webpack with HMR with live reload\n                    // cause Browser-sync has middleware with webpack.\n                    if (tars.config.js.webpack.useHMR && tars.useLiveReload) {\n                        done();\n                    } else {\n                        runSequence(`js:${tars.config.js.bundler}-processing`, done);\n                    }\n                    break;\n                case 'concat':\n                default:\n                    runSequence('js:concat-processing', done);\n                    break;\n            }\n        }),\n    );\n};\n"
  },
  {
    "path": "tars/tasks/js/webpack-processing.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst gutil = tars.packages.gutil;\nconst notifier = tars.helpers.notifier;\nconst browserSync = tars.packages.browserSync;\nconst cwd = process.cwd();\n\nmodule.exports = () => {\n\n    return gulp.task('js:webpack-processing', done => {\n\n        tars.require('webpack')(require(`${cwd}/webpack.config`), (error, stats) => {\n\n            if (!error) {\n                error = stats.toJson().errors[0];\n            }\n\n            if (error) {\n                notifier.error('JavaScript has not been processed', error);\n            } else {\n                console.log(stats.toString({\n                    colors: true\n                }));\n\n                notifier.success('JavaScript has been processed', { notStream: true });\n\n                if (tars.useLiveReload) {\n                    browserSync.reload();\n                }\n            }\n\n            // Task never errs in watch mode, it waits and recompiles\n            if (!tars.options.watch.isActive && error) {\n                done(\n                    new gutil.PluginError(\n                        'webpack-processing',\n                        new Error('An error occured during webpack build process')\n                    )\n                );\n            } else {\n                if (!done.called) {\n                    done.called = true;\n                    done();\n                }\n            }\n        });\n\n    });\n};\n"
  },
  {
    "path": "tars/tasks/main/build-dev.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\n\n/**\n * Build dev-version (without watchers)\n */\nmodule.exports = () => {\n    return gulp.task('main:build-dev', function(cb) {\n        tars.options.notify = false;\n\n        runSequence(\n            'service:clean',\n            ['images:minify-svg', 'images:raster-svg'],\n            [\n                'css:make-sprite-for-svg',\n                'css:make-fallback-for-svg',\n                'css:make-sprite',\n                'images:make-symbols-sprite',\n            ],\n            [\n                'css:compile-css',\n                'css:compile-css-for-ie8',\n                'css:compile-css-for-ie9',\n                'css:move-separate',\n                'html:concat-mocks-data',\n                'other:move-misc-files',\n                'other:move-fonts',\n                'other:move-assets',\n                'images:move-content-img',\n                'images:move-plugins-img',\n                'images:move-general-img',\n                'js:move-separate',\n            ],\n            ['js:processing', 'html:compile-templates'],\n            cb,\n        );\n    });\n};\n"
  },
  {
    "path": "tars/tasks/main/build.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst gutil = tars.packages.gutil;\nconst runSequence = tars.packages.runSequence.use(gulp);\n\n/**\n * Build release version\n */\nmodule.exports = () => {\n    return gulp.task(\n        'main:build',\n        gulp.series('main:build-dev', (done) => {\n            runSequence(\n                ['html:modify-html', 'images:minify-images'],\n                'main:create-build',\n                ['css:compress-css'],\n                'service:zip-build',\n                () => {\n                    console.log(\n                        gutil.colors.black.bold(\n                            '\\n------------------------------------------------------------',\n                        ),\n                    );\n                    tars.say(gutil.colors.green.bold(' Build has been created successfully!'));\n\n                    if (tars.config.useBuildVersioning) {\n                        tars.say(gutil.colors.white.bold('Build version is: ', tars.options.build.version));\n                    }\n                    console.log(\n                        gutil.colors.black.bold(\n                            '------------------------------------------------------------\\n',\n                        ),\n                    );\n                    done();\n                },\n            );\n        }),\n    );\n};\n"
  },
  {
    "path": "tars/tasks/main/create-build.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\n\n/**\n * Copy files from dev to build directory. Create build directory with new build version\n */\nmodule.exports = () => {\n    return gulp.task('main:create-build', () => {\n        return gulp.src([`${tars.config.devPath}**/*.*`, `!${tars.config.devPath}temp/**`], { base: `${tars.config.devPath}` })\n            .pipe(plumber({\n                errorHandler(error) {\n                    notifier.error('An error occurred while running create-build task.', error);\n                }\n            }))\n            .pipe(gulp.dest(tars.options.build.path))\n            .pipe(\n                notifier.success('Pre-build task is finished')\n            );\n    });\n};\n"
  },
  {
    "path": "tars/tasks/main/dev.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst notify = tars.packages.notify;\nconst browserSync = tars.packages.browserSync;\nconst path = require('path');\n\nconst env = process.env;\nconst cwd = process.cwd();\n\nfunction setWatchMode(cb) {\n    tars.options.notify = true;\n    tars.options.watch.isActive = true;\n    cb();\n}\n\n/**\n * Build dev-version with watchers and livereload.\n */\nmodule.exports = () => {\n    /**\n     * Start watchers and show notify\n     */\n    function devTaskFinallyActions(done) {\n        // require system and user's watchers\n        tars.helpers.tarsFsHelper.getWatchers().forEach((file) => require(file)());\n\n        if (tars.config.notifyConfig.useNotify && env.NODE_ENV !== 'production' && !env.DISABLE_NOTIFIER) {\n            notify({\n                title: tars.config.notifyConfig.title,\n                icon: path.resolve(tars.root + '/icons/tars.png'),\n            }).write('Build has been created!');\n        } else {\n            tars.say('Build has been created!');\n        }\n        done();\n    }\n\n    return gulp.task(\n        'main:dev',\n        gulp.series(setWatchMode, 'main:build-dev', (done) => {\n            if (tars.useLiveReload) {\n                const useHMR =\n                    tars.config.js.workflow === 'modular' &&\n                    tars.config.js.bundler === 'webpack' &&\n                    tars.config.js.webpack.useHMR;\n                let browserSyncConfig = tars.pluginsConfig.browserSync;\n\n                /* eslint-disable no-undefined */\n                browserSyncConfig = Object.assign(browserSyncConfig, {\n                    middleware: browserSyncConfig.middleware || [],\n                    port: env.BROWSERSYNC_PORT || browserSyncConfig.port,\n                    logConnections: browserSyncConfig.logConnections || true,\n                    logLevel: browserSyncConfig.logLevel || 'info',\n                    reloadOnRestart: browserSyncConfig.reloadOnRestart || true,\n                    tunnel: tars.flags.tunnel,\n                });\n                /* eslint-enable no-undefined */\n\n                if (!useHMR) {\n                    browserSync.init(browserSyncConfig);\n                    devTaskFinallyActions(done);\n                } else {\n                    const webpackConfig = require(`${cwd}/webpack.config`);\n                    const webpackInstance = tars.require('webpack')(webpackConfig);\n                    const webpackDevMiddlewareInstance = tars.require('webpack-dev-middleware')(\n                        webpackInstance,\n                        {\n                            publicPath: `/${tars.config.fs.staticFolderName}/js/`,\n                            stats: {\n                                colors: true,\n                            },\n                        },\n                    );\n                    const browserSyncMiddleware = [\n                        webpackDevMiddlewareInstance,\n                        tars.require('webpack-hot-middleware')(webpackInstance),\n                    ];\n\n                    browserSyncConfig.middleware = browserSyncConfig.middleware.concat(browserSyncMiddleware);\n                    tars.say('Wait for a moment, please. Webpack is preparing bundle for you...');\n\n                    webpackDevMiddlewareInstance.waitUntilValid(() => {\n                        browserSync.init(browserSyncConfig);\n                        devTaskFinallyActions(done);\n                    });\n                }\n            } else {\n                // Do not start Browser-sync without livereload, just watchers and notifications\n                devTaskFinallyActions(done);\n            }\n        }),\n    );\n};\n"
  },
  {
    "path": "tars/tasks/other/move-assets.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst gulpif = tars.packages.gulpif;\nconst cache = tars.packages.cache;\nconst rename = tars.packages.rename;\nconst path = require('path');\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\nconst browserSync = tars.packages.browserSync;\n\nconst imgAssets = `${tars.config.devPath}${tars.config.fs.staticFolderName}/${tars.config.fs.imagesFolderName}/assets/`;\nconst otherAssets = `${tars.config.devPath}${tars.config.fs.staticFolderName}/${tars.config.fs.componentsFolderName}-assets/`;\n\n/**\n * Move files from components' assets to ready build\n */\nmodule.exports = () => {\n    return gulp.task('other:move-assets', () => {\n        return gulp.src(`./markup/${tars.config.fs.componentsFolderName}/**/assets/**/*.*`)\n            .pipe(plumber({\n                errorHandler(error) {\n                    notifier.error('An error occurred while moving assets.', error);\n                }\n            }))\n            .pipe(cache('move-assets'))\n            .pipe(rename(filepath => {\n                let splittedPath = filepath.dirname.split(path.sep);\n                splittedPath.pop();\n                filepath.dirname = splittedPath.join(path.sep);\n            }))\n            .pipe(\n                gulpif(\n                    /\\.(svg|png|jpg|jpeg|jpe|gif|tiff|bmp|webp)$/i,\n                    gulp.dest(imgAssets),\n                    gulp.dest(otherAssets)\n                )\n            )\n            .pipe(browserSync.reload({ stream: true }))\n            .pipe(notifier.success('Assets\\'ve been moved'));\n    });\n};\n"
  },
  {
    "path": "tars/tasks/other/move-fonts.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst cache = tars.packages.cache;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\nconst browserSync = tars.packages.browserSync;\n\nconst fontsFolderPath = `${tars.config.fs.staticFolderName}/fonts`;\n\n/**\n * Move fonts-files to dev directory\n */\nmodule.exports = () => {\n    return gulp.task('other:move-fonts', () => {\n        return gulp.src(`./markup/${fontsFolderPath}/**/*.*`)\n            .pipe(plumber({\n                errorHandler(error) {\n                    notifier.error('An error occurred while moving fonts.', error);\n                }\n            }))\n            .pipe(cache('move-fonts'))\n            .pipe(gulp.dest(`${tars.config.devPath}${fontsFolderPath}`))\n            .pipe(browserSync.reload({ stream: true }))\n            .pipe(\n                notifier.success('Fonts\\'ve been moved')\n            );\n    });\n};\n"
  },
  {
    "path": "tars/tasks/other/move-misc-files.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\nconst browserSync = tars.packages.browserSync;\n\n/**\n * Move misc files\n */\nmodule.exports = () => {\n    return gulp.task('other:move-misc-files', () => {\n        return gulp.src(`./markup/${tars.config.fs.staticFolderName}/misc/**/*`, { dot: true })\n            .pipe(plumber({\n                errorHandler(error) {\n                    notifier.error('An error occurred while moving misc-files.', error);\n                }\n            }))\n            .pipe(gulp.dest(`${tars.config.devPath}`))\n            .pipe(browserSync.reload({ stream: true }))\n            .pipe(\n                notifier.success('Misc files\\'ve been moved')\n            );\n    });\n};\n"
  },
  {
    "path": "tars/tasks/services/clean.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst del = tars.packages.del;\nconst preProcName = tars.cssPreproc.name;\nconst preprocExtension = tars.cssPreproc.mainExt;\nconst spritesCssPath = `./markup/${tars.config.fs.staticFolderName}/${preProcName}/sprites-${preProcName}`;\n\nlet pathsToDel = [\n    `${tars.config.devPath}`,\n    `${spritesCssPath}/sprite_96.${preprocExtension}`,\n    `${spritesCssPath}/svg-fallback-sprite.${preprocExtension}`,\n    `${spritesCssPath}/svg-sprite.${preprocExtension}`,\n    './.tmpTemplater/',\n    './.tmpPreproc/'\n];\n\n/**\n * Clean dev directory and cache\n */\nmodule.exports = () => {\n    return gulp.task('service:clean', done => {\n        if (!tars.config.useBuildVersioning && !tars.options.watch.isActive) {\n            pathsToDel.push(tars.options.build.path);\n        }\n\n        del(pathsToDel, {force: true}).then(() => {\n            done();\n        });\n    });\n};\n"
  },
  {
    "path": "tars/tasks/services/create-fs.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst del = tars.packages.del;\nconst fs = require('fs');\n\nconst staticFolderName = tars.config.fs.staticFolderName;\nconst staticFolderPath = `markup/${staticFolderName}`;\nconst componentsFolderName = tars.config.fs.componentsFolderName;\nconst componentsFolderPath = `markup/${componentsFolderName}`;\nconst imagesFolderPath = `${staticFolderPath}/${tars.config.fs.imagesFolderName}`;\n\nlet paths = [\n    `${staticFolderPath}/js/framework`,\n    `${staticFolderPath}/js/libraries`,\n    `${staticFolderPath}/js/plugins`,\n    imagesFolderPath,\n    `${imagesFolderPath}/content`,\n    `${imagesFolderPath}/general`,\n    `${imagesFolderPath}/plugins`,\n    `${imagesFolderPath}/sprite`\n];\n\ntars.config.useImagesForDisplayWithDpi.forEach(dpiValue => {\n    paths.push(`${imagesFolderPath}/sprite/${dpiValue}dpi`);\n});\n\npaths.push(\n    `${imagesFolderPath}/svg`,\n    `${staticFolderPath}/fonts`,\n    `${staticFolderPath}/${tars.config.cssPreprocessor}`,\n    `${componentsFolderPath}/_template/assets`,\n    `${componentsFolderPath}/_template/ie`\n);\n\n/**\n * Create fs for project\n */\nmodule.exports = () => {\n    return gulp.task('service:create-fs', done => {\n        const mkdirp = tars.require('mkdirp');\n\n        if (staticFolderName !== 'static') {\n            fs.renameSync('./markup/static/', `./markup/${staticFolderName}`);\n        }\n\n        if (componentsFolderName !== 'components') {\n            del.sync('./markup/components/');\n        }\n\n        paths.forEach(path => {\n            mkdirp(path, error => {\n                if (error) {\n                    console.error(error);\n                }\n            });\n        });\n\n        done(null);\n    });\n};\n"
  },
  {
    "path": "tars/tasks/services/init.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst gutil = tars.packages.gutil;\nconst del = tars.packages.del;\n\n/**\n * Init builder, apply css-preprocessor and templater\n */\nmodule.exports = () => {\n    return gulp.task(\n        'service:init',\n        gulp.series('service:create-fs', (done) => {\n            const ncp = tars.require('ncp');\n\n            const TEMPLATES_PATH = './templates';\n            const PAGES_PATH = 'markup/pages';\n            const COMPONENTS_PATH = `markup/${tars.config.fs.componentsFolderName}`;\n\n            /**\n             * Apply templates files\n             * @type  {String} type of template, templater or preprocessor\n             * @return {Object} Promise\n             */\n            function applyTemplates(type) {\n                return new Promise((resolveTemplatesApplying, rejectTemplatesApplying) => {\n                    if (\n                        (type === 'templater' && tars.flags['exclude-html']) ||\n                        (type === 'preprocessor' && tars.flags['exclude-css'])\n                    ) {\n                        return resolveTemplatesApplying();\n                    }\n\n                    if (type === 'templater') {\n                        const templaterPartsPath = `${TEMPLATES_PATH}/${tars.templater.name}`;\n                        Promise.all([\n                            new Promise((resolve, reject) => {\n                                ncp(`${templaterPartsPath}/${PAGES_PATH}`, `./${PAGES_PATH}`, (error) => {\n                                    if (error) {\n                                        return reject(error);\n                                    }\n                                    return resolve();\n                                });\n                            }),\n                            new Promise((resolve, reject) => {\n                                ncp(\n                                    `${templaterPartsPath}/markup/components`,\n                                    `./${COMPONENTS_PATH}`,\n                                    (error) => {\n                                        if (error) {\n                                            return reject(error);\n                                        }\n\n                                        return resolve();\n                                    },\n                                );\n                            }),\n                        ])\n                            .then(() => resolveTemplatesApplying())\n                            .catch((error) => rejectTemplatesApplying(error));\n                    } else {\n                        const preprocPartsPath = `${TEMPLATES_PATH}/${tars.cssPreproc.name}/markup`;\n                        Promise.all([\n                            new Promise((resolve, reject) => {\n                                ncp(\n                                    `${preprocPartsPath}/static`,\n                                    `./markup/${tars.config.fs.staticFolderName}`,\n                                    (error) => {\n                                        if (error) {\n                                            return reject(error);\n                                        }\n                                        return resolve();\n                                    },\n                                );\n                            }),\n                            new Promise((resolve, reject) => {\n                                ncp(`${preprocPartsPath}/components`, `./${COMPONENTS_PATH}`, (error) => {\n                                    if (error) {\n                                        return reject(error);\n                                    }\n                                    return resolve();\n                                });\n                            }),\n                        ])\n                            .then(() => resolveTemplatesApplying())\n                            .catch((error) => rejectTemplatesApplying(error));\n                    }\n                });\n            }\n\n            /**\n             * Generate start screen\n             * @return {Object} Promise\n             */\n            function generateStartScreen() {\n                return new Promise((resolve) => {\n                    if (tars.cli) {\n                        tars.say(\"It's almost ready!\");\n                    } else {\n                        console.log('\\n');\n                        tars.say('Hi!');\n                        tars.say(\"Let's create awesome markup!\");\n                    }\n\n                    tars.say(\n                        'You can find more info about TARS at ' +\n                            gutil.colors.cyan('\"https://github.com/tars/tars/blob/master/README.md\"'),\n                    );\n\n                    if (tars.cli) {\n                        tars.say(\n                            'Run the command ' +\n                                gutil.colors.cyan('\"tars --help\"') +\n                                ' to see all avalible options and commands.',\n                        );\n                        tars.say('Start your work with ' + gutil.colors.cyan('\"tars dev\"') + '.');\n                    } else {\n                        console.log('\\n');\n                        tars.say(gutil.colors.red.bold(\"You've started TARS via gulp.\"));\n                        tars.say(gutil.colors.red.bold('This mode is depricated for developing.'));\n                        tars.say(gutil.colors.red.bold('Please, do not use \"dev\" tasks in with mode.\\n'));\n                        tars.say('Install tars-cli for developing.');\n                        tars.say(\n                            'Run the command ' +\n                                gutil.colors.cyan('\"npm i -g tars-cli\"') +\n                                ', to install tars-cli.',\n                        );\n                        tars.say('More info: https://github.com/tars/tars-cli.');\n                        console.log('\\n\\n');\n                    }\n\n                    resolve();\n                });\n            }\n\n            /**\n             * Remove temp folders\n             * @return {Object} Promise\n             */\n            function removeTemplatesFolders() {\n                return new Promise((resolve) => {\n                    del(['./templates']).then(() => {\n                        resolve();\n                    });\n                });\n            }\n\n            /**\n             * Generate last screen after success applying templates\n             */\n            function finishInit() {\n                console.log(\n                    gutil.colors.black.bold('\\n--------------------------------------------------------'),\n                );\n                tars.say(gutil.colors.green.bold('TARS has been inited successfully!\\n'));\n                tars.say('You choose:');\n                tars.say(gutil.colors.cyan.bold(tars.cssPreproc.name) + ' as css-preprocessor');\n                tars.say(gutil.colors.cyan.bold(tars.templater.name) + ' as templater\\n');\n\n                if (tars.flags['exclude-html']) {\n                    tars.say('Your templater-files were not changed');\n                }\n\n                if (tars.flags['exclude-css']) {\n                    tars.say('Your ' + tars.templater.name + '-files were not changed');\n                }\n                console.log(\n                    gutil.colors.black.bold('--------------------------------------------------------\\n'),\n                );\n                done();\n            }\n\n            // Start init\n            Promise.all([generateStartScreen(), applyTemplates('templater'), applyTemplates('preprocessor')])\n                .then(removeTemplatesFolders)\n                .then(finishInit)\n                .catch((error) => {\n                    tars.say(gutil.colors.red(error));\n                    tars.say(\n                        'Please, repost with message and the stack trace to developer tars.builder@gmail.com',\n                    );\n                    console.error(error.stack);\n                    done();\n                });\n        }),\n    );\n};\n"
  },
  {
    "path": "tars/tasks/services/remove-init-fs.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst del = tars.packages.del;\nconst staticFolderName = tars.config.fs.staticFolderName;\nconst staticFolderPath = `markup/${staticFolderName}`;\nconst componentsFolderPath = `./markup/${tars.config.fs.componentsFolderName}`;\n\nconst pathsToDel = [\n    `${staticFolderPath}/js/framework`,\n    `${staticFolderPath}/js/libraries`,\n    `${staticFolderPath}/js/plugins`,\n    `${staticFolderPath}/${tars.config.fs.imagesFolderName}/`,\n    `${staticFolderPath}/fonts/`,\n    `${staticFolderPath}/scss/`,\n    `${staticFolderPath}/stylus/`,\n    `${staticFolderPath}/less/`,\n    `${componentsFolderPath}/_template/assets/`,\n    `${componentsFolderPath}/_template/ie/`,\n    `${componentsFolderPath}/head/`,\n    `${componentsFolderPath}/footer/`,\n    `${componentsFolderPath}/_template/_template.scss`,\n    `${componentsFolderPath}/_template/_template.less`,\n    `${componentsFolderPath}/_template/_template.styl`,\n    `${componentsFolderPath}/_template/_template.html`,\n    `${componentsFolderPath}/_template/_template.jade`,\n    './markup/pages/',\n    './.tmpTemplater/',\n    './.tmpPreproc/'\n];\n\n/**\n * Remove inited file structure.\n */\nmodule.exports = () => {\n    return gulp.task('service:remove-init-fs', done => {\n        del(pathsToDel).then(() => {\n            done();\n        });\n    });\n};\n"
  },
  {
    "path": "tars/tasks/services/update-deps.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst gutil = tars.packages.gutil;\nconst fs = require('fs');\n\n/**\n * Update dependencies\n */\nmodule.exports = () => {\n    return gulp.task('service:update-deps', done => {\n        const Download = tars.require('download');\n        const exec = require('child_process').exec;\n        const downloadPackage = new Download({ extract: true })\n            .get('https://raw.githubusercontent.com/tars/tars/master/package.json')\n            .dest('./');\n\n        tars.say(\n            gutil.colors.yellow('This command is depricated and won\\'t be supported in the future!\\n')\n        );\n\n        function downloadNewPackageJson() {\n            fs.rename('./package.json', './_package.json', () => {\n                downloadPackage.run(downloadError => {\n\n                    if (downloadError) {\n                        throw downloadError;\n                    }\n\n                    exec('npm i', (execError, stdout, stderr) => {\n                        console.log(stdout);\n                        console.log(stderr);\n                        console.log(\n                            gutil.colors.black.bold(\n                                '\\n------------------------------------------------------------'\n                            )\n                        );\n                        gutil.log(\n                            gutil.colors.green('✔'),\n                            gutil.colors.green.bold('Deps update has been finished successfully!')\n                        );\n                        console.log(\n                            gutil.colors.black.bold(\n                                '------------------------------------------------------------\\n'\n                            )\n                        );\n                        done(execError);\n                    });\n                });\n            });\n        }\n\n        fs.exists('./_package.json', exists => {\n            if (exists) {\n                fs.unlink('./_package.json', () => {\n                    downloadNewPackageJson();\n                });\n            } else {\n                downloadNewPackageJson();\n            }\n        });\n\n    });\n};\n"
  },
  {
    "path": "tars/tasks/services/zip-build.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\n\n/**\n * Create zip archive of build\n */\nmodule.exports = () => {\n    return gulp.task('service:zip-build', done => {\n\n        if (tars.config.useArchiver) {\n            const zip = tars.require('gulp-zip');\n            const name = tars.packageInfo.name === 'awesome_project' ? 'build' : tars.packageInfo.name.replace(/[\\s?+<>:*|\"\\\\]/g, '_');\n            const version = tars.options.build.version;\n\n            return gulp.src(`${tars.options.build.path}**`, { base: tars.options.build.path })\n                .pipe(plumber({\n                    errorHandler(error) {\n                        notifier.error('An error occurred while creating zip-archive.', error);\n                    }\n                }))\n                .pipe(zip(`${name}${version}.zip`))\n                .pipe(gulp.dest(tars.options.build.path))\n                .pipe(\n                    notifier.success('Zip-archive\\'s been created')\n                );\n        }\n\n        tars.skipTaskLog('service:zip-build', 'Archiver is not used');\n        done(null);\n    });\n};\n"
  },
  {
    "path": "tars/user-tasks/example-task.js",
    "content": "'use strict';\n\n// This is example of task function\n\nconst gulp = tars.packages.gulp;\nconst plumber = tars.packages.plumber;\nconst notifier = tars.helpers.notifier;\n\nconst tarsConfig = tars.config;\n// Include browserSync, if you need to reload browser:\n// const browserSync = tars.packages.browserSync;\n\n/**\n * Task description\n */\nmodule.exports = function() {\n    return gulp.task(\n        'task-name',\n        /*['required-task-name'],*/ function(done) {\n            return (\n                gulp\n                    .src(/* path-string or array of path-strings to files */)\n                    .pipe(\n                        plumber({\n                            errorHandler: function(error) {\n                                notifier.error('An error occurred while something.', error);\n                            },\n                        }),\n                    )\n                    // Do stuff here, like\n                    // .pipe(less())\n                    .pipe(gulp.dest(/* path-string to destination directory. Only directory, not a file! */))\n\n                    // If you need to reload browser, uncomment the row below\n                    // .pipe(browserSync.reload({ stream:true }))\n                    .pipe(\n                        // You can change text of success message\n                        notifier.success('Example task has been finished'),\n                    )\n            );\n\n            // You can return callback, if you can't return pipe\n            // done(null);\n        },\n    );\n};\n"
  },
  {
    "path": "tars/user-tasks/html/helpers/handlebars-helpers.js",
    "content": "'use strict';\n\nconst Handlebars = tars.packages.handlebars;\n\n/**\n * You can add your own helpers to handlebarsHelpers Object\n * All helpers from that object will be available in templates\n * @type {Object}\n */\nconst handlebarsHelpers = {\n\n    /**\n     * This is an example of handlebars-helper\n     * This helper gets string and returns it\n     * @param  {String} str Source string\n     * @return {String}     Result string\n     */\n    exampleHelper: function (str) {\n        return str;\n    }\n};\n\nmodule.exports = handlebarsHelpers;\n"
  },
  {
    "path": "tars/user-tasks/html/helpers/jade-helpers.js",
    "content": "'use strict';\n\n/**\n * You can add your own helpers to jadeHelpers Object\n * All helpers from that object will be available in templates\n * @type {Object}\n */\nconst jadeHelpers = {\n\n    /**\n     * This is an example of handlebars-helper\n     * This helper gets string and returns it\n     * @param  {String} str Source string\n     * @return {String}     Result string\n     */\n    exampleHelper: function (str) {\n        return str;\n    }\n};\n\nmodule.exports = jadeHelpers;\n"
  },
  {
    "path": "tars/user-tasks/html/helpers/modify-options.js",
    "content": "// All options from here will override default params,\n// which are set in modify-html task and in minify and prettify packages.\nmodule.exports = {\n\n    // All options are taken from https://github.com/kangax/html-minifier with default values\n    minifyOpts: {\n\n    },\n\n    /* eslint-disable camelcase */\n\n    // You can set any options here for html-prettify\n    // That options will override default params for html-minify\n    //\n    // Supported options:\n    //\n    // @param {Boolean} indent_inner_html       indent <head> and <body> sections. Default: true\n    // @param {Number}  indent_size             indentation size, default: 4\n    // @param {String}  indent_char             character to indent with, default: ' '\n    // @param {Number}  wrap_line_length        maximum amount of characters per line (0 = disable). Default: 250\n    // @param {String}  brace_style             'collapse' | 'expand' | 'end-expand'\n    //                                          put braces on the same line as control statements (default),\n    //                                          or put braces on own line (Allman / ANSI style),\n    //                                          or just put end braces on own line. Default: 'collapse'\n    // @param {Array}   unformatted             list of tags, that shouldn't be reformatted,\n    //                                          defaults to inline tags. Default: all inline tags.\n    // @param {String}  indent_scripts          'keep' | 'separate' | 'normal'. Default: normal.\n    // @param {Boolean} preserve_newlines       whether existing line breaks before elements should be preserved\n    //                                          Only works before elements, not inside tags or for text.\n    //                                          Default: true.\n    // @param {Number}  max_preserve_newlines   maximum number of line breaks to be preserved in one chunk\n    //                                          Default: unlimited\n    // @param {Boolean} indent_handlebars       format and indent {{#foo}} and {{/foo}}. Default: false\n    prettifyOpts: {\n\n    }\n\n    /* eslint-enable camelcase */\n};\n"
  },
  {
    "path": "tars/user-tasks/html/helpers/pug-helpers.js",
    "content": "'use strict';\n\n/**\n * You can add your own helpers to pugHelpers Object\n * All helpers from that object will be available in templates\n * @type {Object}\n */\nconst pugHelpers = {\n\n    /**\n     * This is an example of handlebars-helper\n     * This helper gets string and returns it\n     * @param  {String} str Source string\n     * @return {String}     Result string\n     */\n    exampleHelper: function (str) {\n        return str;\n    }\n};\n\nmodule.exports = pugHelpers;\n"
  },
  {
    "path": "tars/user-watchers/example-watcher.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\nconst gutil = tars.packages.gutil;\nconst chokidar = tars.packages.chokidar;\nconst watcherLog = tars.helpers.watcherLog;\n\n/**\n * This is an example of watcher\n */\nmodule.exports = function () {\n    return chokidar.watch(\n        '/* String of path pattern or array of strings */',\n        Object.assign(tars.options.watch, {\n            // Options set bellow will override default from tars.options.watch\n            // If you need default options, you can use just tars.options.watch\n            ignored: '/* String of path pattern or array of strings to ignore. If nothing to igonre — just set it with empty string */',\n            persistent: /* Boolean, true by default*/,\n            ignoreInitial: /* Boolean, true by default*/\n        })\n    ).on('all', function (event, watchedPath) {\n        watcherLog(event, watchedPath);\n        // You could start as many tasks as you need\n        runSequence(/* Task name (String) to start */);\n    });\n};\n"
  },
  {
    "path": "tars/watchers/css/common-css.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\nconst watcherLog = tars.helpers.watcherLog;\nconst cssPreprocFolderPath = `markup/${tars.config.fs.staticFolderName}/${tars.cssPreproc.name}`;\nconst globsToWatch = [\n    `${cssPreprocFolderPath}/**/*.${tars.cssPreproc.ext}`,\n    `${cssPreprocFolderPath}/**/*.css`,\n];\n\n/**\n * Watcher for all scss(less or stylus)-files\n */\nmodule.exports = () => {\n    return tars.packages.chokidar\n        .watch(\n            globsToWatch,\n            Object.assign(tars.options.watch, {\n                ignored: [`${cssPreprocFolderPath}/separate-css/**/*.css`],\n            }),\n        )\n        .on('all', (event, watchedPath) => {\n            watcherLog(event, watchedPath);\n            runSequence('css:compile-css');\n\n            if (tars.flags.ie8 || tars.flags.ie) {\n                runSequence('css:compile-css-for-ie8');\n            }\n\n            if (tars.flags.ie9 || tars.flags.ie) {\n                runSequence('css:compile-css-for-ie9');\n            }\n        });\n};\n"
  },
  {
    "path": "tars/watchers/css/ie8-css.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\nconst watcherLog = tars.helpers.watcherLog;\n\n/**\n * Watcher for ie8 stylies\n */\nmodule.exports = () => {\n    if (tars.flags.ie8 || tars.flags.ie) {\n        return tars.packages.chokidar\n            .watch(\n                [\n                    `markup/${tars.config.fs.componentsFolderName}/**/ie8.${tars.cssPreproc.ext}`,\n                    `markup/${tars.config.fs.componentsFolderName}/**/ie8.css`,\n                ],\n                tars.options.watch,\n            )\n            .on('all', (event, watchedPath) => {\n                watcherLog(event, watchedPath);\n                runSequence('css:compile-css-for-ie8');\n            });\n    }\n\n    return false;\n};\n"
  },
  {
    "path": "tars/watchers/css/ie9-css.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\nconst watcherLog = tars.helpers.watcherLog;\n\n/**\n * Watcher for ie9 stylies\n */\nmodule.exports = () => {\n    if (tars.flags.ie9 || tars.flags.ie) {\n        return tars.packages.chokidar\n            .watch(\n                [\n                    `markup/${tars.config.fs.componentsFolderName}/**/ie9.${tars.cssPreproc.ext}`,\n                    `markup/${tars.config.fs.componentsFolderName}/**/ie9.css`,\n                ],\n                tars.options.watch,\n            )\n            .on('all', (event, watchedPath) => {\n                watcherLog(event, watchedPath);\n                runSequence('css:compile-css-for-ie9');\n            });\n    }\n\n    return false;\n};\n"
  },
  {
    "path": "tars/watchers/css/modules-css.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\nconst watcherLog = tars.helpers.watcherLog;\n\n/**\n * Watch for components' css-files\n */\nmodule.exports = () => {\n    return tars.packages.chokidar\n        .watch(\n            `markup/${tars.config.fs.componentsFolderName}/**/*.${tars.cssPreproc.ext}`,\n            Object.assign(tars.options.watch, {\n                ignored: [\n                    `markup/${tars.config.fs.componentsFolderName}/**/ie8.${tars.cssPreproc.ext}`,\n                    `markup/${tars.config.fs.componentsFolderName}/**/ie9.${tars.cssPreproc.ext}`,\n                    `markup/${tars.config.fs.componentsFolderName}/**/ie8.css`,\n                    `markup/${tars.config.fs.componentsFolderName}/**/ie9.css`,\n                ],\n            }),\n        )\n        .on('all', (event, watchedPath) => {\n            watcherLog(event, watchedPath);\n            runSequence('css:compile-css');\n\n            if (tars.flags.ie8 || tars.flags.ie) {\n                runSequence('css:compile-css-for-ie8');\n            }\n\n            if (tars.flags.ie9 || tars.flags.ie) {\n                runSequence('css:compile-css-for-ie9');\n            }\n        });\n};\n"
  },
  {
    "path": "tars/watchers/js/all.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\nconst watcherLog = tars.helpers.watcherLog;\n\nconst jsFolderPath = 'markup/' + tars.config.fs.staticFolderName + '/js';\n\n/**\n * Watcher for js-files before and after components js\n */\nmodule.exports = () => {\n    if (tars.config.js.workflow === 'concat') {\n        let jsPathToWatch = [];\n\n        if (tars.config.js.jsPathsToConcatBeforeModulesJs.length) {\n            jsPathToWatch = jsPathToWatch.concat(tars.config.js.jsPathsToConcatBeforeModulesJs);\n        }\n\n        if (tars.config.js.jsPathsToConcatAfterModulesJs.length) {\n            jsPathToWatch = jsPathToWatch.concat(tars.config.js.jsPathsToConcatAfterModulesJs);\n        }\n\n        jsPathToWatch.push(\n            `${jsFolderPath}/framework/**/*.js`,\n            `${jsFolderPath}/libraries/**/*.js`,\n            `${jsFolderPath}/plugins/**/*.js`,\n            `markup/${tars.config.fs.componentsFolderName}/**/*.js`,\n        );\n\n        return tars.packages.chokidar\n            .watch(\n                jsPathToWatch,\n                Object.assign(tars.options.watch, {\n                    ignored: `markup/${tars.config.fs.componentsFolderName}/**/data/data.js`,\n                }),\n            )\n            .on('all', (event, watchedPath) => {\n                watcherLog(event, watchedPath);\n                runSequence('js:processing');\n            });\n    }\n\n    return false;\n};\n"
  },
  {
    "path": "tars/watchers/move/assets.js",
    "content": "'use strict';\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\n\n/**\n * Watcher for images in assets dir of components\n */\nmodule.exports = () => {\n    return tars.packages.chokidar\n        .watch(\n            `markup/${tars.config.fs.componentsFolderName}/**/assets/*.*`,\n            Object.assign(tars.options.watch, {\n                ignored: `markup/${tars.config.fs.componentsFolderName}/**/assets/*.tmp`,\n            }),\n        )\n        .on('all', (event, watchedPath) => {\n            tars.helpers.watcherLog(event, watchedPath);\n            runSequence('other:move-assets', () => {});\n        });\n};\n"
  },
  {
    "path": "tars/watchers/move/content-img.js",
    "content": "'use strict';\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\nconst imagesFolderPath = `markup/${tars.config.fs.staticFolderName}/${tars.config.fs.imagesFolderName}`;\n\n/**\n * Watcher for images in assets dir of components\n */\nmodule.exports = () => {\n    return tars.packages.chokidar\n        .watch(\n            `${imagesFolderPath}/content/**/*.*`,\n            Object.assign(tars.options.watch, {\n                ignored: `${imagesFolderPath}/content/**/*.tmp`,\n            }),\n        )\n        .on('all', (event, watchedPath) => {\n            tars.helpers.watcherLog(event, watchedPath);\n            runSequence('images:move-content-img');\n        });\n};\n"
  },
  {
    "path": "tars/watchers/move/fonts.js",
    "content": "'use strict';\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\n\n/**\n * Watcher for font files\n */\nmodule.exports = () => {\n    return tars.packages.chokidar\n        .watch(`markup/${tars.config.fs.staticFolderName}/fonts/**/*.*`, tars.options.watch)\n        .on('all', (event, watchedPath) => {\n            tars.helpers.watcherLog(event, watchedPath);\n            runSequence('other:move-fonts');\n        });\n};\n"
  },
  {
    "path": "tars/watchers/move/general-img.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\nconst imagesFolderPath = `markup/${tars.config.fs.staticFolderName}/${tars.config.fs.imagesFolderName}`;\n\n/**\n * Watcher for general images\n */\nmodule.exports = () => {\n    return tars.packages.chokidar\n        .watch(\n            `${imagesFolderPath}/general/**/*.*`,\n            Object.assign(tars.options.watch, {\n                ignored: `${imagesFolderPath}/general/**/*.tmp`,\n            }),\n        )\n        .on('all', (event, watchedPath) => {\n            tars.helpers.watcherLog(event, watchedPath);\n            runSequence('images:move-general-img');\n        });\n};\n"
  },
  {
    "path": "tars/watchers/move/misc-files.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\n\n/**\n * Watcher for misc files\n */\nmodule.exports = () => {\n    return tars.packages.chokidar\n        .watch(\n            `markup/${tars.config.fs.staticFolderName}/misc/**/*.*`,\n            Object.assign(tars.options.watch, {\n                ignored: `markup/${tars.config.fs.staticFolderName}/misc/**/*.tmp`,\n            }),\n        )\n        .on('all', (event, watchedPath) => {\n            tars.helpers.watcherLog(event, watchedPath);\n            runSequence('other:move-misc-files');\n        });\n};\n"
  },
  {
    "path": "tars/watchers/move/plugins-img.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\nconst imagesFolderPath = `markup/${tars.config.fs.staticFolderName}/${tars.config.fs.imagesFolderName}`;\n\n/**\n * Watcher for images of plugins\n */\nmodule.exports = () => {\n    return tars.packages.chokidar\n        .watch(\n            `${imagesFolderPath}/plugins/**/*.*`,\n            Object.assign(tars.options.watch, {\n                ignored: `${imagesFolderPath}/plugins/**/*.tmp`,\n            }),\n        )\n        .on('all', (event, watchedPath) => {\n            tars.helpers.watcherLog(event, watchedPath);\n            runSequence('images:move-plugins-img');\n        });\n};\n"
  },
  {
    "path": "tars/watchers/move/separate-css.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\n\n/**\n * Watcher for separate Js files files\n */\nmodule.exports = () => {\n    return tars.packages.chokidar\n        .watch(\n            `markup/${tars.config.fs.staticFolderName}/${tars.cssPreproc.name}/separate-css/**/*.css`,\n            tars.options.watch,\n        )\n        .on('all', (event, watchedPath) => {\n            tars.helpers.watcherLog(event, watchedPath);\n            runSequence('css:move-separate');\n        });\n};\n"
  },
  {
    "path": "tars/watchers/move/separate-js.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\n\n/**\n * Watcher for separate Js files files\n */\nmodule.exports = () => {\n    return tars.packages.chokidar\n        .watch(`markup/${tars.config.fs.staticFolderName}/js/separate-js/**/*.js`, tars.options.watch)\n        .on('all', (event, watchedPath) => {\n            tars.helpers.watcherLog(event, watchedPath);\n            runSequence('js:move-separate');\n        });\n};\n"
  },
  {
    "path": "tars/watchers/sprite/png-sprites.js",
    "content": "'use strict';\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\n\n/**\n * Watcher for images for sprite (png)\n */\nmodule.exports = () => {\n    return tars.packages.chokidar\n        .watch(\n            `markup/${tars.config.fs.staticFolderName}/${tars.config.fs.imagesFolderName}/sprite/**/*.png`,\n            tars.options.watch,\n        )\n        .on('all', (event, watchedPath) => {\n            tars.helpers.watcherLog(event, watchedPath);\n            runSequence('css:make-sprite', () => {});\n        });\n};\n"
  },
  {
    "path": "tars/watchers/sprite/svg-sprites.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\n\n/**\n * Watcher for images for sprite (svg)\n */\nmodule.exports = () => {\n    if (tars.config.svg.active && tars.config.svg.workflow === 'sprite') {\n        return tars.packages.chokidar.watch(\n            `markup/${tars.config.fs.staticFolderName}/${tars.config.fs.imagesFolderName}/svg/**/*.svg`,\n            tars.options.watch\n        ).on('all', (event, watchedPath) => {\n            tars.helpers.watcherLog(event, watchedPath);\n\n            if (tars.flags.ie8 || tars.flags.ie) {\n                runSequence(\n                    ['images:minify-svg', 'images:raster-svg'],\n                    ['css:make-fallback-for-svg', 'css:make-sprite-for-svg'],\n                    () => {}\n                );\n            } else {\n                runSequence(\n                    'images:minify-svg',\n                    'css:make-sprite-for-svg',\n                    () => {}\n                );\n            }\n        });\n    }\n\n    return false;\n};\n"
  },
  {
    "path": "tars/watchers/sprite/symbols.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\n\n/**\n * Watcher for images for symbols (svg)\n */\nmodule.exports = () => {\n\n    if (tars.config.svg.active && tars.config.svg.workflow === 'symbols') {\n\n        return tars.packages.chokidar.watch(\n            `markup/${tars.config.fs.staticFolderName}/${tars.config.fs.imagesFolderName}/svg/**/*.svg`,\n            tars.options.watch\n        ).on('all', (event, watchedPath) => {\n            tars.helpers.watcherLog(event, watchedPath);\n\n            runSequence(\n                'images:minify-svg',\n                'images:make-symbols-sprite',\n                'html:concat-mocks-data',\n                'html:compile-templates',\n                () => {}\n            );\n        });\n    }\n\n    return false;\n};\n"
  },
  {
    "path": "tars/watchers/templates/data-files.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\nconst templaterName = require(`${tars.root}/helpers/get-templater-name`)(tars.config.templater.toLowerCase());\n\n/**\n * Watcher for data-files of components\n */\nmodule.exports = () => {\n    return tars.packages.chokidar.watch(\n        `markup/${tars.config.fs.componentsFolderName}/**/data/data.js`,\n        tars.options.watch\n    ).on('all', (event, watchedPath) => {\n        tars.helpers.watcherLog(event, watchedPath);\n\n        // Remove cache for components with changed data-files\n        if ((templaterName === 'jade' || templaterName === 'pug') && tars.packages.cache.caches && tars.packages.cache.caches.templates) {\n            const templateToRecompile = watchedPath.split('/data/data.js').shift();\n\n            for (let cacheKey in tars.packages.cache.caches.templates) {\n                if (cacheKey.indexOf(templateToRecompile) > -1) {\n                    delete tars.packages.cache.caches.templates[cacheKey];\n                }\n            }\n        }\n\n        runSequence(\n            'html:concat-mocks-data',\n            'html:compile-templates',\n            () => {}\n        );\n    });\n};\n"
  },
  {
    "path": "tars/watchers/templates/page-modules.js",
    "content": "'use strict';\n\nconst gulp = tars.packages.gulp;\nconst runSequence = tars.packages.runSequence.use(gulp);\nconst path = require('path');\n\nconst filesToWatch = [\n    `markup/pages/**/*.${tars.templater.ext}`,\n    `markup/${tars.config.fs.componentsFolderName}/**/*.${tars.templater.ext}`,\n];\n\n/**\n * Watcher for templates-files of components and pages\n */\nmodule.exports = () => {\n    return tars.packages.chokidar\n        .watch(\n            filesToWatch,\n            Object.assign(tars.options.watch, {\n                ignored: `markup/pages/**/_*.${tars.templater.ext}`,\n            }),\n        )\n        .on('all', (event, watchedPath) => {\n            tars.helpers.watcherLog(event, watchedPath);\n\n            if (\n                watchedPath.indexOf(`markup${path.sep}pages`) > -1 &&\n                (event === 'unlink' || event === 'add')\n            ) {\n                runSequence('html:concat-mocks-data', 'html:compile-templates', () => {});\n            } else {\n                runSequence('html:compile-templates', () => {});\n            }\n        });\n};\n"
  },
  {
    "path": "tars-config.js",
    "content": "'use strict';\n\nmodule.exports = {\n\n    /////////////////////\n    // MUTABLE OPTIONS ////////////////////////////////\n    // YOU CAN CHANGE THIS OPTIONS ALL THE TIME      //\n    //                                               //\n    // You need to restart builder to apply options. //\n    ///////////////////////////////////////////////////\n\n    /**\n     * Postprocessors for TARS\n     * @type {Array}\n     * Example:\n     *\n     * postcss: [\n     *     {\n     *         name: 'postcss-short',\n     *         options: {\n     *             deny: ['text']\n     *         }\n     *     }\n     * ]\n     */\n    postcss: [],\n\n    svg: {\n        active: true,\n        // symbols, sprite\n        workflow: 'sprite',\n        symbolsConfig: {\n            // separate-file, separate-file-with-link, inject\n            loadingType: 'inject',\n            usePolyfillForExternalSymbols: true,\n            pathToExternalSymbolsFile: ''\n        }\n    },\n\n    css: {\n        // concat, manual\n        workflow: 'concat'\n    },\n\n    js: {\n        // concat, modular\n        workflow: 'concat',\n\n        // Only webpack is available right now\n        bundler: 'webpack',\n\n        /**\n         * Use linting of js-files\n         * @type {Boolean}\n         */\n        lint: true,\n\n        /**\n         * Use babel for ES6(ES7-ESNext) syntax support\n         * @type {Boolean}\n         */\n        useBabel: true,\n\n        /**\n         * Remove console.log and debugger from js code in release mode\n         * @type {Boolean}\n         */\n        removeConsoleLog: true,\n\n        // Special config for webpack\n        webpack: {\n            useHMR: false,\n\n            /**\n             * Automatically loaded modules.\n             * Module (value) is loaded when the identifier (key) is used as free variable in a module.\n             * The identifier is filled with the exports of the loaded module.\n             * Example: {$: \"jquery\"} or {React: 'react'}\n             * @type {Object}\n             */\n            providePlugin: {}\n        },\n\n        /**\n         * Path-strings to js-files, which have to be included before modules' js-files\n         * Example: ['./markup/controller/** /*.js']\n         * @type {Array}\n         */\n        jsPathsToConcatBeforeModulesJs: [],\n\n        /**\n         * Lint additional js before modules\n         * @type {Boolean}\n         */\n        lintJsCodeBeforeModules: false,\n\n        /**\n         * Path-strings to js-files, which have to be included before modules' js-files\n         * @type {Array}\n         */\n        jsPathsToConcatAfterModulesJs: [],\n\n        /**\n         * Lint additional js after modules\n         * @type {Boolean}\n         */\n        lintJsCodeAfterModules: false\n    },\n\n    /**\n     * Write sourcemaps\n     * @type {Object}\n     *\n     * active – is sourcemaps active\n     * inline – use inline sourcemaps or in separate file\n     */\n    sourcemaps: {\n        js: {\n            active: true,\n            inline: true\n        },\n        css: {\n            active: true,\n            inline: true\n        }\n    },\n\n    /**\n     * Config for Notify module\n     * @type {Object}\n     */\n    notifyConfig: {\n\n        /**\n         * Do you need to use notify?\n         * @type {Boolean}\n         */\n        useNotify: true,\n\n        /**\n         * Title for notifier\n         * @type {String}\n         */\n        title: 'TARS notification',\n\n        /**\n         * Sounds notifactions\n         * String (name of system sound) or undefined, if you don't need to hear any sounds\n         * @type {Object}\n         */\n        sounds: {\n\n            /**\n             * Sound after successfull finishing of task\n             * @type {String, undefined}\n             * For example 'Glass' in OS X\n             */\n            onSuccess: undefined,\n\n            /**\n             * Sound after failed finishing of task\n             * @type {String, undefined}\n             * For example 'Glass' in OS X\n             */\n            onError: undefined\n        },\n\n        /**\n         * Label for timestamp of task finishing time\n         * @type {String}\n         */\n        taskFinishedText: 'Task finished at: '\n    },\n\n    /**\n     * Minify result html in build version\n     * If is set to false, compiled html will be prettified\n     * @type {Boolean}\n     */\n    minifyHtml: false,\n\n    /**\n     * TARS will generate relative path from current page\n     * to static files in case of true value\n     * @type {Boolean}\n     */\n    generateStaticPath: true,\n\n    /**\n     * Path to dev version of project\n     * Could be like '../../../dev/' or absolute path\n     * If you change the value do not forget to change the 'baseDir' in the file 'plugins-config.json' and .gitignore\n     * The slash after the name should stand\n     * @type {String}\n     */\n    devPath: './dev/',\n\n    /**\n     * Path to build version of project\n     * Could be like '../../../builds/' or absolute path\n     * The slash after the name should stand\n     * @type {String}\n     */\n    buildPath: './builds/',\n\n    /**\n     * Use build versioning\n     * Build version is a date ot building\n     * @type {Boolean}\n     */\n    useBuildVersioning: true,\n\n    /**\n     * Use archiver for your build\n     * @type {Boolean}\n     */\n    useArchiver: true,\n\n    /**\n     * Set ulimit. Topical for Linux-family OS and OSX.\n     * @type {Number}\n     */\n    ulimit: 4096,\n\n    //////////////////////////////////////////////\n    //////////////////////////////////////////////\n\n    ////////////////////////////////////////////////////////\n    // YOU CAN CHANGE THIS OPTIONS AND USE REINIT         //\n    //                                                    //\n    // Options for technologies, which you'd like to use. //\n    ////////////////////////////////////////////////////////\n\n    /**\n     * Templater\n     * Available 'pug', 'jade' and 'handlebars'\n     * @type {String}\n     */\n    templater: 'handlebars',\n\n    /**\n     * Css-preprocessor\n     * Available 'scss', 'less' or 'stylus'\n     * .sass extension is supported if cssPreprocessor is 'scss'\n     * @type {String}\n     */\n    cssPreprocessor: 'scss',\n\n    /**\n     * What kind of size of images are you going to use.\n     * 96 — 1 dppx (regular)\n     * 192 — 2 dppx (retina)\n     * 288 — 3 dppx (nexus 5, for example)\n     * 384 - 4 dppx (nexus 6, for example)\n     * Example if using for all displays: usePpi: [96, 192, 288, 384]\n     * You can change with options not only on init or reinit,\n     * but at with time you have to create new directories\n     * and delete unused.\n     * @type {Array}\n     */\n    useImagesForDisplayWithDpi: [96],\n\n    ////////////////////////////////////////////////\n    ////////////////////////////////////////////////\n\n    ////////////////////////////////////////////////////////\n    // You have to change with options after manually      //\n    // renaming static and img folder                     //\n    //                                                    //\n    // Do not rename these dirs before reinit             //\n    ////////////////////////////////////////////////////////\n\n    /**\n     * File structure settings\n     * @type {Object}\n     */\n    fs: {\n\n        /**\n         * Name of folder with static files, such *.css, *.js and so on\n         * 'static' by default\n         * @type {String}\n         */\n        staticFolderName: 'static',\n\n        /**\n         * Name of folder with images\n         * 'img' by default\n         * @type {String}\n         */\n        imagesFolderName: 'img',\n\n        /**\n         * Name of folder with modules\n         * 'modules' by default\n         * @type {String}\n         */\n        componentsFolderName: 'components'\n    }\n\n    ////////////////////////////////////////////////////\n    ////////////////////////////////////////////////////\n};\n"
  },
  {
    "path": "tars.json",
    "content": "{\n    \"name\": \"tars\",\n    \"version\": \"1.15.1\",\n    \"description\": \"Powerfull markup builder\"\n}\n"
  },
  {
    "path": "templates/handlebars/markup/components/_template/_template.html",
    "content": ""
  },
  {
    "path": "templates/handlebars/markup/components/default_component_scheme.json",
    "content": "{\n    \"folders\": [\n        {\n            \"name\": \"data\",\n            \"files\": [\n                {\n                    \"name\": \"data.js\",\n                    \"content\": \"var data = {__componentName__: {}}\"\n                }\n            ]\n        }\n    ],\n\n    \"files\": [\n        {\n            \"name\": \"__componentName__.__templateExtension__\",\n            \"content\": \"<div class=\\\"__componentName__\\\"></div>\"\n        }, {\n            \"name\": \"__componentName__.__cssExtension__\",\n            \"content\": \".__componentName__ {}\"\n        }, {\n            \"name\": \"__componentName__.js\",\n            \"content\": \"\"\n        }\n    ]\n}\n"
  },
  {
    "path": "templates/handlebars/markup/components/example/example.html",
    "content": "<h1>\n    Hello, World!\n</h1>"
  },
  {
    "path": "templates/handlebars/markup/components/footer/footer.html",
    "content": "<div class=\"footer\"></div>"
  },
  {
    "path": "templates/handlebars/markup/components/head/data/data.js",
    "content": "head: {\n    defaults: {\n        title: 'default title',\n        useSocialMetaTags: true\n    }\n}"
  },
  {
    "path": "templates/handlebars/markup/components/head/head.html",
    "content": "<meta charset=\"utf-8\">\n<meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\n<title>{{title}}</title>\n<meta content=\"\" name=\"description\">\n<meta content=\"\" name=\"keywords\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n<meta content=\"telephone=no\" name=\"format-detection\">\n<!-- This make sence for mobile browsers. It means, that content has been optimized for mobile browsers -->\n<meta name=\"HandheldFriendly\" content=\"true\">\n<!--[if IE 8 ]><link href=\"%=static=%css/main_ie8%=hash=%%=min=%.css\" rel=\"stylesheet\" type=\"text/css\"><![endif]-->\n<!--[if IE 9 ]><link href=\"%=static=%css/main_ie9%=hash=%%=min=%.css\" rel=\"stylesheet\" type=\"text/css\"><![endif]-->\n<!--[if (gt IE 9)|!(IE)]><!--><link href=\"%=static=%css/main%=hash=%%=min=%.css\" rel=\"stylesheet\" type=\"text/css\"><!--<![endif]-->\n\n{{#if useSocialMetaTags}}\n    <meta property=\"og:title\" content=\"\" />\n    <meta property=\"og:url\" content=\"\" />\n    <meta property=\"og:description\" content=\"\" />\n    <meta property=\"og:image\" content=\"\" />\n    <meta property=\"og:image:type\" content=\"image/jpeg\" />\n    <meta property=\"og:image:width\" content=\"500\" />\n    <meta property=\"og:image:height\" content=\"300\" />\n    <meta property=\"twitter:description\" content=\"\" />\n    <link rel=\"image_src\" href=\"\" />\n{{/if}}\n\n<link rel=\"icon\" type=\"image/x-icon\" href=\"favicon.ico\">\n<script>\n    (function(H){H.className=H.className.replace(/\\bno-js\\b/,'js')})(document.documentElement)\n</script>\n<!--[if lt IE 9 ]><script src=\"%=static=%js/separate-js/html5shiv-3.7.2.min.js\" type=\"text/javascript\"></script><meta content=\"no\" http-equiv=\"imagetoolbar\"><![endif]-->\n"
  },
  {
    "path": "templates/handlebars/markup/pages/_template.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"ru\">\n\n    <head>\n        {{> head/head head.defaults}}\n    </head>\n\n    <body class=\"page\">\n        %=symbols=%\n\n        <section class=\"page__wrapper\">\n\n            <!-- Include your modules here -->\n\n            <div class=\"page__buffer\"></div>\n\n        </section>\n\n        <footer class=\"page__footer\">\n            {{> footer/footer}}\n        </footer>\n\n        <script src=\"%=static=%js/separate-js/svg4everybody.min.js\"></script>\n        <script>svg4everybody();</script>\n\n        <!-- Main scripts. You can replace it, but I recommend you to leave it here     -->\n        <script src=\"%=static=%js/main%=hash=%%=min=%.js\"></script>\n    </body>\n\n</html>"
  },
  {
    "path": "templates/handlebars/markup/pages/index.html",
    "content": "<!doctype html>\n<html class=\"no-js\" lang=\"ru\">\n\n    <head>\n        {{> head/head head.defaults}}\n    </head>\n\n    <body class=\"page\">\n        %=symbols=%\n\n        <section class=\"page__wrapper\">\n\n            <!-- Include your modules here -->\n\n            {{> example/example}}\n\n            <div class=\"page__buffer\"></div>\n\n        </section>\n\n        <footer class=\"page__footer\">\n            {{> footer/footer}}\n        </footer>\n\n        <script src=\"%=static=%js/separate-js/svg4everybody.min.js\"></script>\n        <script>svg4everybody();</script>\n\n        <!-- Main scripts. You can replace it, but I recommend you to leave it here     -->\n        <script src=\"%=static=%js/main%=hash=%%=min=%.js\"></script>\n    </body>\n\n</html>"
  },
  {
    "path": "templates/jade/markup/components/_template/_template.jade",
    "content": "mixin _template(data)"
  },
  {
    "path": "templates/jade/markup/components/default_component_scheme.json",
    "content": "{\n    \"folders\": [\n        {\n            \"name\": \"data\",\n            \"files\": [\n                {\n                    \"name\": \"data.js\",\n                    \"content\": \"var data = {__componentName__: {}}\"\n                }\n            ]\n        }\n    ],\n\n    \"files\": [\n        {\n            \"name\": \"__componentName__.__templateExtension__\",\n            \"content\": \"mixin __componentName__(data)\\n    .__componentName__\"\n        }, {\n            \"name\": \"__componentName__.__cssExtension__\",\n            \"content\": \".__componentName__ {}\"\n        }, {\n            \"name\": \"__componentName__.js\",\n            \"content\": \"\"\n        }\n    ]\n}\n"
  },
  {
    "path": "templates/jade/markup/components/example/example.jade",
    "content": "mixin example(data)\n    h1\n        | Hello, World!"
  },
  {
    "path": "templates/jade/markup/components/footer/footer.jade",
    "content": "mixin footer(data)\n    footer.footer"
  },
  {
    "path": "templates/jade/markup/components/head/data/data.js",
    "content": "head: {\n    defaults: {\n        title: 'default title',\n        useSocialMetaTags: true\n    }\n}"
  },
  {
    "path": "templates/jade/markup/components/head/head.jade",
    "content": "mixin head(data)\n    meta(charset=\"utf-8\")\n    meta(http-equiv=\"x-ua-compatible\", content=\"ie=edge\")\n    title #{data.title}\n    meta(content=\"\", name=\"description\")\n    meta(content=\"\", name=\"keywords\")\n    meta(name=\"viewport\", content=\"width=device-width, initial-scale=1.0\")\n    meta(content=\"telephone=no\", name=\"format-detection\")\n    //- This make sence for mobile browsers. It means, that content has been optimized for mobile browsers\n    meta(name=\"HandheldFriendly\", content=\"true\")\n\n    |<!--[if IE 8 ]><link href=\"%=static=%css/main_ie8%=hash=%%=min=%.css\" rel=\"stylesheet\" type=\"text/css\"><![endif]-->\n    |<!--[if IE 9 ]><link href=\"%=static=%css/main_ie9%=hash=%%=min=%.css\" rel=\"stylesheet\" type=\"text/css\"><![endif]-->\n    |<!--[if (gt IE 9)|!(IE)]><!--><link href=\"%=static=%css/main%=hash=%%=min=%.css\" rel=\"stylesheet\" type=\"text/css\"><!--<![endif]-->\n\n    if data.useSocialMetaTags\n        meta(property=\"og:title\", content=\"#{data.title}\")\n        meta(property=\"og:title\", content=\"\")\n        meta(property=\"og:url\", content=\"\")\n        meta(property=\"og:description\", content=\"\")\n        meta(property=\"og:image\", content=\"\")\n        meta(property=\"og:image:type\", content=\"image/jpeg\")\n        meta(property=\"og:image:width\", content=\"500\")\n        meta(property=\"og:image:height\", content=\"300\")\n        meta(property=\"twitter:description\", content=\"\")\n        link(rel=\"image_src\", href=\"\")\n\n    link(rel=\"icon\" type=\"image/x-icon\" href=\"favicon.ico\")\n    script.\n        (function(H){H.className=H.className.replace(/\\bno-js\\b/,'js')})(document.documentElement)\n    |<!--[if lt IE 9 ]><script src=\"%=static=%js/separate-js/html5shiv-3.7.2.min.js\" type=\"text/javascript\"></script><meta content=\"no\" http-equiv=\"imagetoolbar\"><![endif]-->\n"
  },
  {
    "path": "templates/jade/markup/pages/_template.jade",
    "content": "doctype html\nhtml(class=\"no-js\", lang=\"ru\")\n\n    include ../components/head/head\n    include ../components/footer/footer\n\n    head\n        +head(head.defaults)\n    body.page\n        |%=symbols=%\n\n        section.page__wrapper\n\n            //- Include your components here\n\n            .page__buffer\n\n        .page__footer\n            +footer()\n\n        script(src='%=static=%js/separate-js/svg4everybody.min.js')\n        script svg4everybody();\n\n        //- Main scripts. You can replace it, but I recommend you to leave it here\n        script(src='%=static=%js/main%=hash=%%=min=%.js')\n"
  },
  {
    "path": "templates/jade/markup/pages/index.jade",
    "content": "doctype html\nhtml(class=\"no-js\", lang=\"ru\")\n\n    include ../components/head/head\n    include ../components/example/example\n    include ../components/footer/footer\n\n    head\n        +head(head.defaults)\n    body.page\n        |%=symbols=%\n\n        section.page__wrapper\n\n            //- Include your components here\n            +example()\n\n            .page__buffer\n\n        .page__footer\n            +footer()\n\n        script(src='%=static=%js/separate-js/svg4everybody.min.js')\n        script svg4everybody();\n\n        //- Main scripts. You can replace it, but I recommend you to leave it here\n        script(src='%=static=%js/main%=hash=%%=min=%.js')"
  },
  {
    "path": "templates/less/markup/components/_template/_template.less",
    "content": ""
  },
  {
    "path": "templates/less/markup/static/less/GUI.less",
    "content": "// GUI stylies of the project\n// For example, styles of the links, buttons and so on."
  },
  {
    "path": "templates/less/markup/static/less/common.less",
    "content": "// Common styles of the project\n\nhtml, body {\n    height: 100%;\n}\n\n.page {\n    // Стили для body\n}\n\n.page__wrapper {\n    min-height: 100%;\n    margin-bottom: -50px;\n}\n\n* html .page__wrapper {\n    height: 100%;\n}\n\n.page__buffer {\n    height: 50px;\n}"
  },
  {
    "path": "templates/less/markup/static/less/entry/built-in-partials/_service-ie8.less",
    "content": "/* Some styles, which is used for correct sprite-generation, vars, mixins and etc */\n/* Please, do not edit with file! */\n/* This file can be overwritten by update-project! */\n\n/* Mixins, which are specific for current project */\n@import '../../mixins.less';\n\n/* Mixins and vars for sprite generation */\n@import '../../sprites-less/sprite_96.less';\n@import '../../sprites-less/sprite-png.less';\n@import '../../sprites-less/svg-fallback-sprite.less';\n@import '../../sprites-less/sprite-png-ie.less';\n\n/* Less for used fonts */\n@import '../../fonts.less';\n\n/* Vars, which are specific for current project */\n@import '../../vars.less';\n\n/* Styles for UI-elements */\n@import '../../GUI.less';\n\n/* Common styles for current project */\n@import '../../common.less';\n"
  },
  {
    "path": "templates/less/markup/static/less/entry/built-in-partials/_service.less",
    "content": "/* Some styles, which is used for correct sprite-generation, vars, mixins and etc */\n/* Please, do not edit with file! */\n/* This file can be overwritten by update-project! */\n\n/* Mixins, which are specific for current project */\n@import '../../mixins.less';\n\n/* Mixins and vars for sprite generation */\n@import '../../sprites-less/sprite_96.less';\n@import '../../sprites-less/sprite-png.less';\n@import '../../sprites-less/svg-sprite.less';\n\n/* Less for used fonts */\n@import '../../fonts.less';\n\n/* Vars, which are specific for current project */\n@import '../../vars.less';\n\n/* Styles for UI-elements */\n@import '../../GUI.less';\n\n/* Common styles for current project */\n@import '../../common.less';\n"
  },
  {
    "path": "templates/less/markup/static/less/entry/ie/main_ie8.less",
    "content": "@import '../../normalize.less';\n\n/* Libraries, which is used in current project. */\n@import '../partials/_libraries.less';\n\n/* Libraries, which is used in current project. */\n@import '../built-in-partials/_service-ie8.less';\n\n/* Plugins, which is used in current project. */\n@import '../partials/_plugins.less';\n\n/* Components, which is used in current project. */\n@import '../partials/_components.less';\n@import '../partials/_components-ie8.less';\n\n/* Additional style files. */\n@import '../../etc/etc.less';\n"
  },
  {
    "path": "templates/less/markup/static/less/entry/ie/main_ie9.less",
    "content": "@import '../../normalize.less';\n\n/* Libraries, which is used in current project. */\n@import '../partials/_libraries.less';\n\n/* Libraries, which is used in current project. */\n@import '../built-in-partials/_service.less';\n\n/* Plugins, which is used in current project. */\n@import '../partials/_plugins.less';\n\n/* Components, which is used in current project. */\n@import '../partials/_components.less';\n@import '../partials/_components-ie9.less';\n\n/* Additional style files. */\n@import '../../etc/etc.less';\n"
  },
  {
    "path": "templates/less/markup/static/less/entry/main.less",
    "content": "@import '../normalize.less';\n\n/* Libraries, which is used in current project. */\n@import 'partials/_libraries.less';\n\n/* Libraries, which is used in current project. */\n@import 'built-in-partials/_service.less';\n\n/* Plugins, which is used in current project. */\n@import 'partials/_plugins.less';\n\n/* Components, which is used in current project. */\n@import 'partials/_components.less';\n\n/* Additional style files. */\n@import '../etc/etc.less';\n"
  },
  {
    "path": "templates/less/markup/static/less/entry/partials/_components-ie8.less",
    "content": ""
  },
  {
    "path": "templates/less/markup/static/less/entry/partials/_components-ie9.less",
    "content": ""
  },
  {
    "path": "templates/less/markup/static/less/entry/partials/_components.less",
    "content": "// @import 'components/_template/_template.less';"
  },
  {
    "path": "templates/less/markup/static/less/entry/partials/_libraries.less",
    "content": ""
  },
  {
    "path": "templates/less/markup/static/less/entry/partials/_plugins.less",
    "content": ""
  },
  {
    "path": "templates/less/markup/static/less/etc/etc.less",
    "content": ""
  },
  {
    "path": "templates/less/markup/static/less/fonts.less",
    "content": "/* Your custom fonts here */\n\n/* Example\n\n@font-face {\n    font-family: 'CustomFont';\n    src: url('../fonts/Custom-Font.eot');\n    src: url('../fonts/Custom-Font.eot?#iefix') format('embedded-opentype'),\n         url('../fonts/Custom-Font.woff') format('woff'),\n         url('../fonts/Custom-Font.svg#custom_font') format('svg');\n    font-weight: 400;       // For normal width. It could has another value\n    font-style: normal;     // Also could has another value\n    }\n\n\n// Var for using custom font\n@CustomFont: 'CustomFont', Helvetica, Arial, sans-serif;\n*/"
  },
  {
    "path": "templates/less/markup/static/less/libraries/library-sample.less",
    "content": ""
  },
  {
    "path": "templates/less/markup/static/less/mixins.less",
    "content": "// Mixins.\n\n.nl() {\n    margin: 0;\n    padding: 0;\n    text-indent: 0;\n    list-style: none;\n    list-style-position: outside;\n}\n\n.cf() {\n    &:before,\n    &:after {\n        display: table;\n        content: \"\";\n    }\n\n    &:after {\n        clear: both;\n    }\n\n    .lt-ie8 & {\n        zoom: 1;\n    }\n}\n\n.blocks-justify() {\n    text-align: justify;\n    text-justify: newspaper;\n}\n\n// You can add your own mixins here:"
  },
  {
    "path": "templates/less/markup/static/less/normalize.less",
    "content": "/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n   ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n    line-height: 1.15; /* 1 */\n    -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n   ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n    margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n    display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n    font-size: 2em;\n    margin: 0.67em 0;\n}\n\n/* Grouping content\n   ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n    box-sizing: content-box; /* 1 */\n    height: 0; /* 1 */\n    overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n    font-family: monospace, monospace; /* 1 */\n    font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n   ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n    background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n    border-bottom: none; /* 1 */\n    text-decoration: underline; /* 2 */\n    text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n    font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n    font-family: monospace, monospace; /* 1 */\n    font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n    font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n    font-size: 75%;\n    line-height: 0;\n    position: relative;\n    vertical-align: baseline;\n}\n\nsub {\n    bottom: -0.25em;\n}\n\nsup {\n    top: -0.5em;\n}\n\n/* Embedded content\n   ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n    border-style: none;\n}\n\n/* Forms\n   ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n    font-family: inherit; /* 1 */\n    font-size: 100%; /* 1 */\n    line-height: 1.15; /* 1 */\n    margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n    overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n    text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n    -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n    border-style: none;\n    padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n    outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n    padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n *    `fieldset` elements in all browsers.\n */\n\nlegend {\n    box-sizing: border-box; /* 1 */\n    color: inherit; /* 2 */\n    display: table; /* 1 */\n    max-width: 100%; /* 1 */\n    padding: 0; /* 3 */\n    white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n    vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n    overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n    box-sizing: border-box; /* 1 */\n    padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n    height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n    -webkit-appearance: textfield; /* 1 */\n    outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n    -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n    -webkit-appearance: button; /* 1 */\n    font: inherit; /* 2 */\n}\n\n/* Interactive\n   ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n    display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n    display: list-item;\n}\n\n/* Misc\n   ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n    display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n    display: none;\n}\n"
  },
  {
    "path": "templates/less/markup/static/less/plugins/sample-plugin.less",
    "content": "// This is a sample file for scss for plugins\n// Each plugin's scss code have to be in separate files"
  },
  {
    "path": "templates/less/markup/static/less/separate-css/separate-css-sample.css",
    "content": ""
  },
  {
    "path": "templates/less/markup/static/less/sprite-generator-templates/less.sprite.mustache",
    "content": "{\n  // Default options\n  'functions': true\n}\n\n{{#items}}\n  @{{name}}: {{px.x}} {{px.y}} {{px.offset_x}} {{px.offset_y}} {{px.width}} {{px.height}} {{px.total_width}} {{px.total_height}} '{{{escaped_image}}}';\n{{/items}}\n\n{{#options.functions}}\n  .sprite-position(@sprite) {\n    @sprite-offset-x: ~`\"@{sprite}\".split(', ')[2]`;\n    @sprite-offset-y: ~`\"@{sprite}\".split(', ')[3]`;\n    background-position: @sprite-offset-x  @sprite-offset-y;\n  }\n\n  .sprite-image(@sprite) {\n    {{! DEV: We perform a slice due to a trailing brace from string coercion of arrays }}\n    @sprite-image: ~`'%=static=%png-sprite/96dpi/' + \"@{sprite}\".split(', ')[8].replace(']', '').replace(/\\'/g, '')`;\n    background-image: url(@sprite-image);\n  }\n\n  .sprite-mixin-template(@sprite) {\n    .sprite-image(@sprite);\n    .sprite-position(@sprite);\n    width: ~`\"@{sprite}\".split(', ')[4]`;\n    height: ~`\"@{sprite}\".split(', ')[5]`;\n  }\n\n  .bg-template(@sprite, @repeat: no-repeat) {\n    .sprite-mixin-template(@sprite);\n    @sprite-total-width: ~`\"@{sprite}\".split(', ')[6]`;\n    @sprite-total-height: ~`\"@{sprite}\".split(', ')[7]`;\n    background-size: @sprite-total-width, @sprite-total-height;\n    background-repeat: @repeat;\n  }\n\n  .highDpiMedia(@sprite) {\n    {{#options.dpi192}}\n      @media screen and (-webkit-min-device-pixel-ratio: 2), only screen and ( min-resolution: 192dpi), only screen and ( min-resolution: 2dppx), only screen and (min-device-pixel-ratio: 2) {\n          @sprite-image: ~`'%=static=%png-sprite/192dpi/' + \"@{sprite}\".split(', ')[8].replace(']', '').replace(/\\'/g, '')`;\n          background-image: url(@sprite-image);\n      }\n    {{/options.dpi192}}\n\n    {{#options.dpi288}}\n      @media screen and (-webkit-min-device-pixel-ratio: 3), only screen and ( min-resolution: 288dpi), only screen and ( min-resolution: 3dppx), only screen and (min-device-pixel-ratio: 3) {\n          @sprite-image: ~`'%=static=%png-sprite/288dpi/' + \"@{sprite}\".split(', ')[8].replace(']', '').replace(/\\'/g, '')`;\n          background-image: url(@sprite-image);\n      }\n    {{/options.dpi288}}\n\n    {{#options.dpi384}}\n      @media screen and (-webkit-min-device-pixel-ratio: 4), only screen and ( min-resolution: 384dpi), only screen and ( min-resolution: 4dppx), only screen and (min-device-pixel-ratio: 4) {\n          @sprite-image: ~`'%=static=%png-sprite/384dpi/' + \"@{sprite}\".split(', ')[8].replace(']', '').replace(/\\'/g, '')`;\n          background-image: url(@sprite-image);\n      }\n    {{/options.dpi384}}\n    }\n{{/options.functions}}"
  },
  {
    "path": "templates/less/markup/static/less/sprite-generator-templates/less.svg-fallback-sprite.mustache",
    "content": "{\n  // Default options\n  'functions': true\n}\n\n{{#items}}\n  @{{name}}: {{px.x}} {{px.y}} {{px.offset_x}} {{px.offset_y}} {{px.width}} {{px.height}} {{px.total_width}} {{px.total_height}} '{{{escaped_image}}}' '{{{name}}}';\n{{/items}}\n\n{{#options.functions}}\n  .svg-sprite-position(@svg-sprite) {\n    @svg-sprite-offset-x: ~`\"@{svg-sprite}\".split(', ')[2]`;\n    @svg-sprite-offset-y: ~`\"@{svg-sprite}\".split(', ')[3]`;\n    background-position: @svg-sprite-offset-x  @svg-sprite-offset-y;\n  }\n\n  .svg-sprite-image(@svg-sprite) {\n    @svg-sprite-image-url: ~`'../img/rastered-svg-sprite/' + \"@{svg-sprite}\".split(', ')[8].replace(']', '').replace(/\\'/g, '')`;\n    background-image: url(@svg-sprite-image-url);\n  }\n\n  .bg-svg(@svg-sprite, @repeat: no-repeat) {\n    .svg-sprite-image(@svg-sprite);\n    .svg-sprite-position(@svg-sprite);\n    width: ~`\"@{svg-sprite}\".split(', ')[4]`;\n    height: ~`\"@{svg-sprite}\".split(', ')[5]`;\n\n    background-repeat: @repeat;\n  }\n{{/options.functions}}"
  },
  {
    "path": "templates/less/markup/static/less/sprite-generator-templates/less.svg-sprite.mustache",
    "content": "{{#sprites}}\n  @{{fileName}}: {{x}}{{units}} {{y}}{{units}} {{w}}{{units}} {{h}}{{units}} {{width}}{{units}} {{height}}{{units}} '{{{cssPathSvg}}}' '{{{fileName}}}';\n{{/sprites}}\n\n.svg-sprite-position(@svg-sprite) {\n  @svg-sprite-offset-x: ~`\"@{svg-sprite}\".split(', ')[0].replace('[', '')`;\n  @svg-sprite-offset-y: ~`\"@{svg-sprite}\".split(', ')[1]`;\n  background-position: @svg-sprite-offset-x  @svg-sprite-offset-y;\n}\n\n.bg-svg(@svg-sprite, @repeat: no-repeat) {\n    background-image: url('%=static=%svg-sprite/{{imgName}}');\n    .svg-sprite-position(@svg-sprite);\n    width: ~`\"@{svg-sprite}\".split(', ')[2]`;\n    height: ~`\"@{svg-sprite}\".split(', ')[3]`;\n\n    background-repeat: @repeat;\n}"
  },
  {
    "path": "templates/less/markup/static/less/sprites-less/sprite-png-ie.less",
    "content": ".bg(@sprite, @repeat: no-repeat) {\n    .bg-template(@sprite, @repeat: no-repeat);\n}"
  },
  {
    "path": "templates/less/markup/static/less/sprites-less/sprite-png.less",
    "content": ".bg(@sprite, @repeat: no-repeat) {\n    .bg-template(@sprite, @repeat: no-repeat);\n    .highDpiMedia(@sprite);\n}"
  },
  {
    "path": "templates/less/markup/static/less/vars.less",
    "content": "// File for less-vars.\n// For example: main colors, paddings and so on."
  },
  {
    "path": "templates/pug/markup/components/_template/_template.pug",
    "content": "mixin _template(data)\n    ._template"
  },
  {
    "path": "templates/pug/markup/components/default_component_scheme.json",
    "content": "{\n    \"folders\": [\n        {\n            \"name\": \"data\",\n            \"files\": [\n                {\n                    \"name\": \"data.js\",\n                    \"content\": \"var data = {__componentName__: {}}\"\n                }\n            ]\n        }\n    ],\n\n    \"files\": [\n        {\n            \"name\": \"__componentName__.__templateExtension__\",\n            \"content\": \"mixin __componentName__(data)\\n    .__componentName__\"\n        }, {\n            \"name\": \"__componentName__.__cssExtension__\",\n            \"content\": \".__componentName__ {}\"\n        }, {\n            \"name\": \"__componentName__.js\",\n            \"content\": \"\"\n        }\n    ]\n}\n"
  },
  {
    "path": "templates/pug/markup/components/example/example.pug",
    "content": "mixin example(data)\n    h1\n        | Hello, World!"
  },
  {
    "path": "templates/pug/markup/components/footer/footer.pug",
    "content": "mixin footer(data)\n    footer.footer"
  },
  {
    "path": "templates/pug/markup/components/head/data/data.js",
    "content": "head: {\n    defaults: {\n        title: 'default title',\n        useSocialMetaTags: true\n    }\n}"
  },
  {
    "path": "templates/pug/markup/components/head/head.pug",
    "content": "mixin head(data)\n    meta(charset=\"utf-8\")\n    meta(http-equiv=\"x-ua-compatible\", content=\"ie=edge\")\n    title #{data.title}\n    meta(content=\"\", name=\"description\")\n    meta(content=\"\", name=\"keywords\")\n    meta(name=\"viewport\", content=\"width=device-width, initial-scale=1.0\")\n    meta(content=\"telephone=no\", name=\"format-detection\")\n    //- This make sence for mobile browsers. It means, that content has been optimized for mobile browsers\n    meta(name=\"HandheldFriendly\", content=\"true\")\n\n    |<!--[if IE 8 ]><link href=\"%=static=%css/main_ie8%=hash=%%=min=%.css\" rel=\"stylesheet\" type=\"text/css\"><![endif]-->\n    |<!--[if IE 9 ]><link href=\"%=static=%css/main_ie9%=hash=%%=min=%.css\" rel=\"stylesheet\" type=\"text/css\"><![endif]-->\n    |<!--[if (gt IE 9)|!(IE)]><!--><link href=\"%=static=%css/main%=hash=%%=min=%.css\" rel=\"stylesheet\" type=\"text/css\"><!--<![endif]-->\n\n    if data.useSocialMetaTags\n        meta(property=\"og:title\", content=\"#{data.title}\")\n        meta(property=\"og:title\", content=\"\")\n        meta(property=\"og:url\", content=\"\")\n        meta(property=\"og:description\", content=\"\")\n        meta(property=\"og:image\", content=\"\")\n        meta(property=\"og:image:type\", content=\"image/jpeg\")\n        meta(property=\"og:image:width\", content=\"500\")\n        meta(property=\"og:image:height\", content=\"300\")\n        meta(property=\"twitter:description\", content=\"\")\n        link(rel=\"image_src\", href=\"\")\n\n    link(rel=\"icon\" type=\"image/x-icon\" href=\"favicon.ico\")\n    script.\n        (function(H){H.className=H.className.replace(/\\bno-js\\b/,'js')})(document.documentElement)\n    |<!--[if lt IE 9 ]><script src=\"%=static=%js/separate-js/html5shiv-3.7.2.min.js\" type=\"text/javascript\"></script><meta content=\"no\" http-equiv=\"imagetoolbar\"><![endif]-->\n"
  },
  {
    "path": "templates/pug/markup/pages/_template.pug",
    "content": "doctype html\nhtml(class=\"no-js\", lang=\"ru\")\n\n    include ../components/head/head.pug\n    include ../components/footer/footer.pug\n\n    head\n        +head(head.defaults)\n    body.page\n        |%=symbols=%\n\n        section.page__wrapper\n\n            //- Include your components here\n\n            .page__buffer\n\n        .page__footer\n            +footer()\n\n        script(src='%=static=%js/separate-js/svg4everybody.min.js')\n        script svg4everybody();\n\n        //- Main scripts. You can replace it, but I recommend you to leave it here\n        script(src='%=static=%js/main%=hash=%%=min=%.js')\n"
  },
  {
    "path": "templates/pug/markup/pages/index.pug",
    "content": "doctype html\nhtml(class=\"no-js\", lang=\"ru\")\n\n    include ../components/head/head.pug\n    include ../components/example/example.pug\n    include ../components/footer/footer.pug\n\n    head\n        +head(head.defaults)\n    body.page\n        |%=symbols=%\n\n        section.page__wrapper\n\n            //- Include your components here\n            +example()\n\n            .page__buffer\n\n        .page__footer\n            +footer()\n\n        script(src='%=static=%js/separate-js/svg4everybody.min.js')\n        script svg4everybody();\n\n        //- Main scripts. You can replace it, but I recommend you to leave it here\n        script(src='%=static=%js/main%=hash=%%=min=%.js')"
  },
  {
    "path": "templates/scss/markup/components/_template/_template.scss",
    "content": ""
  },
  {
    "path": "templates/scss/markup/static/scss/GUI.scss",
    "content": "// GUI stylies of the project\n// For example, styles of the links, buttons and so on."
  },
  {
    "path": "templates/scss/markup/static/scss/common.scss",
    "content": "// Common styles of the project\n\nhtml, body {\n    height: 100%;\n}\n\n.page {\n    \n}\n\n.page__wrapper {\n    min-height: 100%;\n    margin-bottom: -50px;\n}\n\n* html .page__wrapper {\n    height: 100%;\n}\n\n.page__buffer {\n    height: 50px;\n}"
  },
  {
    "path": "templates/scss/markup/static/scss/entry/built-in-partials/_service-ie8.scss",
    "content": "/* Some styles, which is used for correct sprite-generation, vars, mixins and etc */\n/* Please, do not edit with file! */\n/* This file can be overwritten bu update-project! */\n\n/* Mixins, which are specific for current project */\n@import '../../mixins.scss';\n\n/* Mixins and vars for sprite generation */\n@import '../../sprites-scss/sprite_96.scss';\n@import '../../sprites-scss/sprite-ie.scss';\n@import '../../sprites-scss/svg-fallback-sprite.scss';\n\n/* Scss for used fonts */\n@import '../../fonts.scss';\n\n/* Vars, which are specific for current project */\n@import '../../vars.scss';\n\n/* Styles for UI-elements */\n@import '../../GUI.scss';\n\n/* Common styles for current project */\n@import '../../common.scss';\n"
  },
  {
    "path": "templates/scss/markup/static/scss/entry/built-in-partials/_service.scss",
    "content": "/* Some styles, which is used for correct sprite-generation, vars, mixins and etc */\n/* Please, do not edit with file! */\n/* This file can be overwritten by update-project! */\n\n/* Mixins, which are specific for current project */\n@import '../../mixins.scss';\n\n/* Mixins and vars for sprite generation */\n@import '../../sprites-scss/sprite_96.scss';\n@import '../../sprites-scss/svg-sprite.scss';\n\n/* Scss for used fonts */\n@import '../../fonts.scss';\n\n/* Vars, which are specific for current project */\n@import '../../vars.scss';\n\n/* Styles for UI-elements */\n@import '../../GUI.scss';\n\n/* Common styles for current project */\n@import '../../common.scss';\n"
  },
  {
    "path": "templates/scss/markup/static/scss/entry/ie/main_ie8.scss",
    "content": "@import '../../normalize.scss';\n\n/* Libraries, which is used in current project. Can be removed! */\n@import '../partials/_libraries.scss';\n\n/* Libraries, which is used in current project. Do not remove! */\n@import '../built-in-partials/_service-ie8.scss';\n\n/* Plugins, which is used in current project. Can be removed! */\n@import '../partials/_plugins.scss';\n\n/* Components, which is used in current project. Can be removed! */\n@import '../partials/_components.scss';\n@import '../partials/_components-ie8.scss';\n\n/* Additional style files. Can be removed! */\n@import '../../etc/etc.scss';\n"
  },
  {
    "path": "templates/scss/markup/static/scss/entry/ie/main_ie9.scss",
    "content": "@import '../../normalize.scss';\n\n/* Libraries, which is used in current project. Can be removed! */\n@import '../partials/_libraries.scss';\n\n/* Libraries, which is used in current project. Do not remove! */\n@import '../built-in-partials/_service.scss';\n\n/* Plugins, which is used in current project. Can be removed! */\n@import '../partials/_plugins.scss';\n\n/* Components, which is used in current project. Can be removed! */\n@import '../partials/_components.scss';\n@import '../partials/_components-ie9.scss';\n\n/* Additional style files. Can be removed! */\n@import '../../etc/etc.scss';\n"
  },
  {
    "path": "templates/scss/markup/static/scss/entry/main.scss",
    "content": "@import '../normalize.scss';\n\n/* Libraries, which is used in current project. */\n@import 'partials/_libraries.scss';\n\n/* Libraries, which is used in current project. */\n@import 'built-in-partials/_service.scss';\n\n/* Plugins, which is used in current project. */\n@import 'partials/_plugins.scss';\n\n/* Components, which is used in current project. */\n@import 'partials/_components.scss';\n\n/* Additional style files. */\n@import '../etc/etc.scss';\n"
  },
  {
    "path": "templates/scss/markup/static/scss/entry/partials/_components-ie8.scss",
    "content": ""
  },
  {
    "path": "templates/scss/markup/static/scss/entry/partials/_components-ie9.scss",
    "content": ""
  },
  {
    "path": "templates/scss/markup/static/scss/entry/partials/_components.scss",
    "content": "// @import 'components/_template/_template.scss';\n"
  },
  {
    "path": "templates/scss/markup/static/scss/entry/partials/_libraries.scss",
    "content": ""
  },
  {
    "path": "templates/scss/markup/static/scss/entry/partials/_plugins.scss",
    "content": ""
  },
  {
    "path": "templates/scss/markup/static/scss/etc/etc.scss",
    "content": ""
  },
  {
    "path": "templates/scss/markup/static/scss/fonts.scss",
    "content": "/* Your custom fonts here */\n\n/* Example\n\n@font-face {\n    font-family: 'CustomFont';\n    src: url('../fonts/Custom-Font.eot');\n    src: url('../fonts/Custom-Font.eot?#iefix') format('embedded-opentype'),\n         url('../fonts/Custom-Font.woff') format('woff'),\n         url('../fonts/Custom-Font.svg#custom_font') format('svg');\n    font-weight: 400;       // For normal width. It could has another value   \n    font-style: normal;     // Also could has another value\n    }\n\n\n// Var for using custom font\n$CustomFont: 'CustomFont', Helvetica, Arial, sans-serif;\n*/"
  },
  {
    "path": "templates/scss/markup/static/scss/libraries/library-sample.scss",
    "content": ""
  },
  {
    "path": "templates/scss/markup/static/scss/mixins.scss",
    "content": "// Mixins.\n\n@mixin nl {\n    margin: 0;\n    padding: 0;\n    text-indent: 0;\n    list-style: none;\n    list-style-position: outside;\n}\n\n@mixin cf {\n    &:before,\n    &:after {\n        display: table;\n        content: \"\";\n    }\n\n    &:after {\n        clear: both;\n    }\n\n    .lt-ie8 & {\n        zoom: 1;\n    }\n}\n\n@mixin blocks-justify {\n    text-align: justify;\n    text-justify: newspaper;\n}\n\n// You can add your own mixins here:"
  },
  {
    "path": "templates/scss/markup/static/scss/normalize.scss",
    "content": "/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n   ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n    line-height: 1.15; /* 1 */\n    -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n   ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n    margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n    display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n    font-size: 2em;\n    margin: 0.67em 0;\n}\n\n/* Grouping content\n   ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n    box-sizing: content-box; /* 1 */\n    height: 0; /* 1 */\n    overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n    font-family: monospace, monospace; /* 1 */\n    font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n   ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n    background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n    border-bottom: none; /* 1 */\n    text-decoration: underline; /* 2 */\n    text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n    font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n    font-family: monospace, monospace; /* 1 */\n    font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n    font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n    font-size: 75%;\n    line-height: 0;\n    position: relative;\n    vertical-align: baseline;\n}\n\nsub {\n    bottom: -0.25em;\n}\n\nsup {\n    top: -0.5em;\n}\n\n/* Embedded content\n   ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n    border-style: none;\n}\n\n/* Forms\n   ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n    font-family: inherit; /* 1 */\n    font-size: 100%; /* 1 */\n    line-height: 1.15; /* 1 */\n    margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n    overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n    text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n    -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n    border-style: none;\n    padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n    outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n    padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n *    `fieldset` elements in all browsers.\n */\n\nlegend {\n    box-sizing: border-box; /* 1 */\n    color: inherit; /* 2 */\n    display: table; /* 1 */\n    max-width: 100%; /* 1 */\n    padding: 0; /* 3 */\n    white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n    vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n    overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n    box-sizing: border-box; /* 1 */\n    padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n    height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n    -webkit-appearance: textfield; /* 1 */\n    outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n    -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n    -webkit-appearance: button; /* 1 */\n    font: inherit; /* 2 */\n}\n\n/* Interactive\n   ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n    display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n    display: list-item;\n}\n\n/* Misc\n   ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n    display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n    display: none;\n}\n"
  },
  {
    "path": "templates/scss/markup/static/scss/plugins/sample-plugin.scss",
    "content": "// This is a sample file for scss for plugins\n// Each plugin's scss code have to be in separate files"
  },
  {
    "path": "templates/scss/markup/static/scss/separate-css/separate-css-sample.css",
    "content": ""
  },
  {
    "path": "templates/scss/markup/static/scss/sprite-generator-templates/scss.sprite.mustache",
    "content": "{\n  // Default options\n  'functions': true\n}\n\n{{#items}}\n  ${{name}}: {{px.x}} {{px.y}} {{px.offset_x}} {{px.offset_y}} {{px.width}} {{px.height}} {{px.total_width}} {{px.total_height}} '{{{escaped_image}}}';\n{{/items}}\n\n{{#options.functions}}\n  @mixin sprite-position($sprite) {\n    $sprite-offset-x: nth($sprite, 3);\n    $sprite-offset-y: nth($sprite, 4);\n    background-position: $sprite-offset-x  $sprite-offset-y;\n  }\n\n  @mixin sprite-image($sprite) {\n    $sprite-image: nth($sprite, 9);\n    background-image: url(%=static=%png-sprite/96dpi/#{$sprite-image});\n  }\n\n  @mixin sprite-mixin-template($sprite) {\n    @include sprite-image($sprite);\n    @include sprite-position($sprite);\n    width: nth($sprite, 5);\n    height: nth($sprite, 6);\n  }\n\n  @mixin bg($sprite, $repeat: no-repeat) {\n    @include sprite-mixin-template($sprite);\n    $sprite-total-width: nth($sprite, 7);\n    $sprite-total-height: nth($sprite, 8);\n    background-size: $sprite-total-width, $sprite-total-height;\n    background-repeat: $repeat;\n\n    {{#options.dpi192}}\n      @media screen and (-webkit-min-device-pixel-ratio: 2), only screen and ( min-resolution: 192dpi), only screen and ( min-resolution: 2dppx), only screen and (min-device-pixel-ratio: 2) {\n          $sprite-image: nth($sprite, 9);\n          background-image: url(%=static=%png-sprite/192dpi/#{$sprite-image});\n      }\n    {{/options.dpi192}}\n\n    {{#options.dpi288}}\n      @media screen and (-webkit-min-device-pixel-ratio: 3), only screen and ( min-resolution: 288dpi), only screen and ( min-resolution: 3dppx), only screen and (min-device-pixel-ratio: 3) {\n          $sprite-image: nth($sprite, 9);\n          background-image: url(%=static=%png-sprite/288dpi/#{$sprite-image});\n      }\n    {{/options.dpi288}}\n\n    {{#options.dpi384}}\n      @media screen and (-webkit-min-device-pixel-ratio: 4), only screen and ( min-resolution: 384dpi), only screen and ( min-resolution: 4dppx), only screen and (min-device-pixel-ratio: 4) {\n          $sprite-image: nth($sprite, 9);\n          background-image: url(%=static=%png-sprite/384dpi/#{$sprite-image});\n      }\n    {{/options.dpi384}}\n  }\n{{/options.functions}}"
  },
  {
    "path": "templates/scss/markup/static/scss/sprite-generator-templates/scss.svg-fallback-sprite.mustache",
    "content": "{\n  // Default options\n  'functions': true\n}\n\n{{#items}}\n  ${{name}}: {{px.x}} {{px.y}} {{px.offset_x}} {{px.offset_y}} {{px.width}} {{px.height}} {{px.total_width}} {{px.total_height}} '{{{escaped_image}}}' '{{{name}}}';\n{{/items}}\n\n{{#options.functions}}\n  @mixin svg-sprite-position($svg-sprite) {\n    $svg-sprite-offset-x: nth($svg-sprite, 3);\n    $svg-sprite-offset-y: nth($svg-sprite, 4);\n    background-position: $svg-sprite-offset-x  $svg-sprite-offset-y;\n  }\n\n  @mixin svg-sprite-image($svg-sprite) {\n    $svg-sprite-image: nth($svg-sprite, 9);\n    background-image: url(%=static=%rastered-svg-sprite/#{$svg-sprite-image});\n  }\n\n  @mixin bg-svg($svg-sprite, $repeat: no-repeat) {\n    @include svg-sprite-image($svg-sprite);\n    @include svg-sprite-position($svg-sprite);\n    width: nth($svg-sprite, 5);\n    height: nth($svg-sprite, 6);\n\n    background-repeat: $repeat;\n  }\n{{/options.functions}}"
  },
  {
    "path": "templates/scss/markup/static/scss/sprite-generator-templates/scss.svg-sprite.mustache",
    "content": "{{#sprites}}\n  ${{fileName}}: {{x}}{{units}} {{y}}{{units}} {{w}}{{units}} {{h}}{{units}} {{width}}{{units}} {{height}}{{units}} '{{{cssPathSvg}}}' '{{{fileName}}}';\n{{/sprites}}\n\n\n\n@mixin svg-sprite-position($svg-sprite) {\n  $svg-sprite-offset-x: nth($svg-sprite, 1);\n  $svg-sprite-offset-y: nth($svg-sprite, 2);\n  background-position: $svg-sprite-offset-x  $svg-sprite-offset-y;\n}\n\n@mixin bg-svg($svg-sprite, $repeat: no-repeat) {\n    background-image: url('%=static=%svg-sprite/{{imgName}}');\n    @include svg-sprite-position($svg-sprite);\n    width: nth($svg-sprite, 3);\n    height: nth($svg-sprite, 4);\n    background-repeat: $repeat;\n}\n"
  },
  {
    "path": "templates/scss/markup/static/scss/sprites-scss/sprite-ie.scss",
    "content": "@mixin bg($sprite, $repeat: no-repeat) {\n    @include sprite-mixin-template($sprite);\n    background-repeat: $repeat;\n}\n"
  },
  {
    "path": "templates/scss/markup/static/scss/vars.scss",
    "content": "// File for scss-vars.\n// For example: main colors, paddings and so on."
  },
  {
    "path": "templates/stylus/markup/components/_template/_template.styl",
    "content": ""
  },
  {
    "path": "templates/stylus/markup/static/stylus/GUI.styl",
    "content": "// GUI stylies of the project\n// For example, styles of the links, buttons and so on."
  },
  {
    "path": "templates/stylus/markup/static/stylus/common.styl",
    "content": "// Common styles of the project\n\nhtml, body\n    height 100%\n\n\n.page\n    // Стили для body\n\n.page__wrapper\n    min-height 100%\n    margin-bottom -50px\n\n\n* html .page__wrapper\n    height 100%\n\n.page__buffer\n    height 50px"
  },
  {
    "path": "templates/stylus/markup/static/stylus/entry/built-in-partials/_service-ie8.styl",
    "content": "/* Some styles, which is used for correct sprite-generation, vars, mixins and etc */\n/* Please, do not edit with file! */\n/* This file can be overwritten by update-project! */\n\n/* Mixins, which are specific for current project */\n@import '../../mixins.styl';\n\n/* Mixins and vars for sprite generation */\n@import '../../sprites-stylus/sprite_96.styl';\n@import '../../sprites-stylus/sprite-png.styl';\n@import '../../sprites-stylus/svg-fallback-sprite.styl';\n@import '../../sprites-stylus/sprite-png-ie.styl';\n\n/* Stylus for used fonts */\n@import '../../fonts.styl';\n\n/* Vars, which are specific for current project */\n@import '../../vars.styl';\n\n/* Styles for UI-elements */\n@import '../../GUI.styl';\n\n/* Common styles for current project */\n@import '../../common.styl';\n"
  },
  {
    "path": "templates/stylus/markup/static/stylus/entry/built-in-partials/_service.styl",
    "content": "/* Some styles, which is used for correct sprite-generation, vars, mixins and etc */\n/* Please, do not edit with file! */\n/* This file can be overwritten by update-project! */\n\n/* Mixins, which are specific for current project */\n@import '../../mixins.styl';\n\n/* Mixins and vars for sprite generation */\n@import '../../sprites-stylus/sprite_96.styl';\n@import '../../sprites-stylus/sprite-png.styl';\n@import '../../sprites-stylus/svg-sprite.styl';\n\n/* Stylus for used fonts */\n@import '../../fonts.styl';\n\n/* Vars, which are specific for current project */\n@import '../../vars.styl';\n\n/* Styles for UI-elements */\n@import '../../GUI.styl';\n\n/* Common styles for current project */\n@import '../../common.styl';\n"
  },
  {
    "path": "templates/stylus/markup/static/stylus/entry/ie/main_ie8.styl",
    "content": "@import '../../normalize.styl';\n\n/* Libraries, which is used in current project. */\n@import '../partials/_libraries.styl';\n\n/* Libraries, which is used in current project. */\n@import '../built-in-partials/_service-ie8.styl';\n\n/* Plugins, which is used in current project. */\n@import '../partials/_plugins.styl';\n\n/* Components, which is used in current project. */\n@import '../partials/_components.styl';\n@import '../partials/_components-ie8.styl';\n\n/* Additional style files. */\n@import '../../etc/etc.styl';\n"
  },
  {
    "path": "templates/stylus/markup/static/stylus/entry/ie/main_ie9.styl",
    "content": "@import '../../normalize.styl';\n\n/* Libraries, which is used in current project. */\n@import '../partials/_libraries.styl';\n\n/* Libraries, which is used in current project. */\n@import '../built-in-partials/_service.styl';\n\n/* Plugins, which is used in current project. */\n@import '../partials/_plugins.styl';\n\n/* Components, which is used in current project. */\n@import '../partials/_components.styl';\n@import '../partials/_components-ie9.styl';\n\n/* Additional style files. */\n@import '../../etc/etc.styl';\n"
  },
  {
    "path": "templates/stylus/markup/static/stylus/entry/main.styl",
    "content": "@import '../normalize.styl';\n\n/* Libraries, which is used in current project. */\n@import 'partials/_libraries.styl';\n\n/* Libraries, which is used in current project. */\n@import 'built-in-partials/_service.styl';\n\n/* Plugins, which is used in current project. */\n@import 'partials/_plugins.styl';\n\n/* Components, which is used in current project. */\n@import 'partials/_components.styl';\n\n/* Additional style files. */\n@import '../etc/etc.styl';\n"
  },
  {
    "path": "templates/stylus/markup/static/stylus/entry/partials/_components-ie8.styl",
    "content": ""
  },
  {
    "path": "templates/stylus/markup/static/stylus/entry/partials/_components-ie9.styl",
    "content": ""
  },
  {
    "path": "templates/stylus/markup/static/stylus/entry/partials/_components.styl",
    "content": "// @import 'components/_template/_template.styl';"
  },
  {
    "path": "templates/stylus/markup/static/stylus/entry/partials/_libraries.styl",
    "content": ""
  },
  {
    "path": "templates/stylus/markup/static/stylus/entry/partials/_plugins.styl",
    "content": ""
  },
  {
    "path": "templates/stylus/markup/static/stylus/etc/etc.styl",
    "content": ""
  },
  {
    "path": "templates/stylus/markup/static/stylus/fonts.styl",
    "content": "/* Your custom fonts here */\n\n/* Example\n\n@font-face {\n    font-family: 'CustomFont';\n    src: url('../fonts/Custom-Font.eot');\n    src: url('../fonts/Custom-Font.eot?#iefix') format('embedded-opentype'),\n         url('../fonts/Custom-Font.woff') format('woff'),\n         url('../fonts/Custom-Font.svg#custom_font') format('svg');\n    font-weight: 400;       // For normal width. It could has another value\n    font-style: normal;     // Also could has another value\n    }\n\n\n// Var for using custom font\n$CustomFont: 'CustomFont', Helvetica, Arial, sans-serif;\n*/"
  },
  {
    "path": "templates/stylus/markup/static/stylus/libraries/library-sample.styl",
    "content": ""
  },
  {
    "path": "templates/stylus/markup/static/stylus/mixins.styl",
    "content": "// Mixins.\n\nm-nl()\n    margin 0\n    padding 0\n    text-indent 0\n    list-style none\n    list-style-position outside\n\nm-cf()\n    &:before, &:after\n        display table\n        content \"\"\n\n    &:after\n        clear both\n\n    .lt-ie8 &\n        zoom 1\n\n\nm-blocks-justify()\n    text-align justify\n    text-justify newspaper\n\n\n// You can add your own mixins here:"
  },
  {
    "path": "templates/stylus/markup/static/stylus/normalize.styl",
    "content": "/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n   ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n    line-height: 1.15; /* 1 */\n    -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n   ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n    margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n    display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n    font-size: 2em;\n    margin: 0.67em 0;\n}\n\n/* Grouping content\n   ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n    box-sizing: content-box; /* 1 */\n    height: 0; /* 1 */\n    overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n    font-family: monospace, monospace; /* 1 */\n    font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n   ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n    background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n    border-bottom: none; /* 1 */\n    text-decoration: underline; /* 2 */\n    text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n    font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n    font-family: monospace, monospace; /* 1 */\n    font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n    font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n    font-size: 75%;\n    line-height: 0;\n    position: relative;\n    vertical-align: baseline;\n}\n\nsub {\n    bottom: -0.25em;\n}\n\nsup {\n    top: -0.5em;\n}\n\n/* Embedded content\n   ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n    border-style: none;\n}\n\n/* Forms\n   ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n    font-family: inherit; /* 1 */\n    font-size: 100%; /* 1 */\n    line-height: 1.15; /* 1 */\n    margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n    overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n    text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n    -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n    border-style: none;\n    padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n    outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n    padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n *    `fieldset` elements in all browsers.\n */\n\nlegend {\n    box-sizing: border-box; /* 1 */\n    color: inherit; /* 2 */\n    display: table; /* 1 */\n    max-width: 100%; /* 1 */\n    padding: 0; /* 3 */\n    white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n    vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n    overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n    box-sizing: border-box; /* 1 */\n    padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n    height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n    -webkit-appearance: textfield; /* 1 */\n    outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n    -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n    -webkit-appearance: button; /* 1 */\n    font: inherit; /* 2 */\n}\n\n/* Interactive\n   ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n    display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n    display: list-item;\n}\n\n/* Misc\n   ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n    display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n    display: none;\n}\n"
  },
  {
    "path": "templates/stylus/markup/static/stylus/plugins/sample-plugin.styl",
    "content": ""
  },
  {
    "path": "templates/stylus/markup/static/stylus/separate-css/separate-css-sample.css",
    "content": ""
  },
  {
    "path": "templates/stylus/markup/static/stylus/sprite-generator-templates/stylus.sprite.mustache",
    "content": "{\n  // Default options\n  'functions': true\n}\n\n{{#items}}\n  ${{name}} = {{px.x}} {{px.y}} {{px.offset_x}} {{px.offset_y}} {{px.width}} {{px.height}} {{px.total_width}} {{px.total_height}} '{{{escaped_image}}}' '{{{name}}}';\n{{/items}}\n\n{{#options.functions}}\n\n  bg-template($sprite, $repeat = no-repeat) {\n    width: $sprite[4];\n    height: $sprite[5];\n    background-position: $sprite[2] $sprite[3];\n    background-image: url('%=static=%png-sprite/96dpi/' + $sprite[8]);\n    background-size: $sprite[6] $sprite[7];\n    background-repeat: $repeat;\n  }\n\n  highDpiMedia($sprite) {\n    {{#options.dpi192}}\n      @media screen and (-webkit-min-device-pixel-ratio: 2), only screen and ( min-resolution: 192dpi), only screen and ( min-resolution: 2dppx), only screen and (min-device-pixel-ratio: 2) {\n          background-image: url('%=static=%png-sprite/192dpi/' + $sprite[8]);\n      }\n    {{/options.dpi192}}\n\n    {{#options.dpi288}}\n      @media screen and (-webkit-min-device-pixel-ratio: 3), only screen and ( min-resolution: 288dpi), only screen and ( min-resolution: 3dppx), only screen and (min-device-pixel-ratio: 3) {\n          background-image: url('%=static=%png-sprite/288dpi/' + $sprite[8]);\n      }\n    {{/options.dpi288}}\n\n    {{#options.dpi384}}\n      @media screen and (-webkit-min-device-pixel-ratio: 4), only screen and ( min-resolution: 384dpi), only screen and ( min-resolution: 4dppx), only screen and (min-device-pixel-ratio: 4) {\n        background-image: url('%=static=%png-sprite/384dpi/' + $sprite[8]);\n      }\n    {{/options.dpi384}}\n  }\n\n{{/options.functions}}"
  },
  {
    "path": "templates/stylus/markup/static/stylus/sprite-generator-templates/stylus.svg-fallback-sprite.mustache",
    "content": "{\n  // Default options\n  'functions': true\n}\n\n{{#items}}\n  ${{name}} = {{px.x}} {{px.y}} {{px.offset_x}} {{px.offset_y}} {{px.width}} {{px.height}} {{px.total_width}} {{px.total_height}} '{{{escaped_image}}}' '{{{name}}}';\n{{/items}}\n\n{{#options.functions}}\n  svg-sprite-position($svg-sprite) {\n    $svg-sprite-offset-x = $svg-sprite[2];\n    $svg-sprite-offset-y = $svg-sprite[3];\n    background-position: $svg-sprite-offset-x  $svg-sprite-offset-y;\n  }\n\n  svg-sprite-image($svg-sprite) {\n    background-image: url('%=static=%rastered-svg-sprite/' + $svg-sprite[8]);\n  }\n\n  bg-svg($svg-sprite, $repeat = no-repeat) {\n    svg-sprite-image($svg-sprite);\n    svg-sprite-position($svg-sprite);\n    width: $svg-sprite[4];\n    height: $svg-sprite[5];\n\n    background-repeat: $repeat;\n  }\n{{/options.functions}}"
  },
  {
    "path": "templates/stylus/markup/static/stylus/sprite-generator-templates/stylus.svg-sprite.mustache",
    "content": "{{#sprites}}\n  ${{fileName}} = {{x}}{{units}} {{y}}{{units}} {{w}}{{units}} {{h}}{{units}} {{width}}{{units}} {{height}}{{units}} '{{{cssPathSvg}}}' '{{{fileName}}}';\n{{/sprites}}\n\nsvg-sprite-position($svg-sprite) {\n  $svg-sprite-offset-x = $svg-sprite[0];\n  $svg-sprite-offset-y = $svg-sprite[1];\n  background-position: $svg-sprite-offset-x  $svg-sprite-offset-y;\n}\n\nbg-svg($svg-sprite, $repeat = no-repeat) {\n    background-image: url('%=static=%svg-sprite/{{imgName}}');\n    svg-sprite-position($svg-sprite);\n    width: $svg-sprite[2];\n    height: $svg-sprite[3];\n\n    background-repeat: $repeat;\n}"
  },
  {
    "path": "templates/stylus/markup/static/stylus/sprites-stylus/sprite-png-ie.styl",
    "content": "bg($sprite, $repeat = no-repeat) {\n    bg-template($sprite, $repeat = no-repeat);\n}"
  },
  {
    "path": "templates/stylus/markup/static/stylus/sprites-stylus/sprite-png.styl",
    "content": "bg($sprite, $repeat = no-repeat) {\n    bg-template($sprite, $repeat = no-repeat);\n    highDpiMedia($sprite);\n}"
  },
  {
    "path": "templates/stylus/markup/static/stylus/vars.styl",
    "content": "// File for less-vars.\n// For example: main colors, paddings and so on."
  },
  {
    "path": "user-package.json",
    "content": "{\n    \"dependencies\": {\n\n    }\n}"
  },
  {
    "path": "webpack.config.js",
    "content": "'use strict';\n\nconst path = require('path');\nconst cwd = process.cwd();\nconst webpack = tars.require('webpack');\nconst TerserJsPlugin = tars.require('terser-webpack-plugin');\n\nconst staticFolderName = tars.config.fs.staticFolderName;\nconst compressJs = tars.flags.release || tars.flags.min || tars.flags.m;\nconst generateSourceMaps = tars.config.sourcemaps.js.active && tars.isDevMode;\nconst sourceMapsDest = tars.config.sourcemaps.js.inline ? 'inline-' : '';\nconst sourceMapsType = `#${sourceMapsDest}source-map`;\nconst webpackMode = !compressJs ? 'development' : 'production';\n\nlet outputFileNameTemplate = '[name]';\nlet modulesDirectories = ['node_modules'];\nlet rules = [\n    {\n        test: /\\.js$/,\n        loader: 'source-map-loader',\n        enforce: 'pre'\n    }\n];\nlet plugins = [\n    new webpack.DefinePlugin({\n        'process.env': {\n            NODE_ENV: JSON.stringify(process.env.NODE_ENV)\n        }\n    })\n];\nlet minimizers = [];\n\nif (process.env.npmRoot) {\n    modulesDirectories.push(process.env.npmRoot);\n}\n\nif (compressJs) {\n    outputFileNameTemplate += `${tars.options.build.hash}.min`;\n    minimizers.push(\n        new TerserJsPlugin({\n            terserOptions: {\n                compress: {\n                    /* eslint-disable camelcase */\n                    drop_console: tars.config.js.removeConsoleLog,\n                    drop_debugger: tars.config.js.removeConsoleLog\n                    /* eslint-enable camelcase */\n                },\n                mangle: false\n            }\n        })\n    );\n}\n\nif (tars.config.js.webpack.providePlugin) {\n    plugins.push(\n        new webpack.ProvidePlugin(tars.config.js.webpack.providePlugin)\n    );\n}\n\nif (tars.options.watch.isActive && tars.config.js.webpack.useHMR) {\n    plugins.push(\n        new webpack.HotModuleReplacementPlugin()\n    );\n}\n\nif (tars.config.js.lint) {\n    rules.push(\n        {\n            test: /\\.js$/,\n            loader: 'eslint-loader',\n            enforce: 'pre',\n            include: `${cwd}/markup`,\n            options: {\n                configFile: `${cwd}/.eslintrc`\n            }\n        }\n    );\n}\n\nif (tars.config.js.useBabel) {\n    rules.push(\n        {\n            test: /\\.js$/,\n            loader: 'babel-loader',\n            include: /markup/\n        }\n    );\n}\n\n/**\n * Add to each entry point entries for webpack dev-server and webpack-hot-middleware\n * @param  {Object} entryConfig\n * @return {Object}\n */\nfunction prepareEntryPoints(entryConfig) {\n    const useHMR = tars.config.js.webpack.useHMR;\n    let devServerEntryPoints = [\n        'webpack/hot/dev-server',\n        'webpack-hot-middleware/client?reload=true'\n    ];\n\n    if (!useHMR || !tars.useLiveReload) {\n        return entryConfig;\n    }\n\n    // Take webpack dev-server and webpack-hot-middleware from TARS-CLI, if TARS has been started by TARS-CLI\n    if (process.env.npmRoot) {\n        devServerEntryPoints = devServerEntryPoints.map(devServerEntryPoint => process.env.npmRoot + devServerEntryPoint);\n    }\n\n    /* eslint-disable guard-for-in */\n    for (let entryPointName in entryConfig) {\n        entryConfig[entryPointName] = devServerEntryPoints.concat(entryConfig[entryPointName]);\n    }\n    /* eslint-disable guard-for-in */\n\n    return entryConfig;\n}\nmodule.exports = {\n    mode: webpackMode,\n    // We have to add some pathes to entry point in case of using HMR\n    entry: prepareEntryPoints({\n        main: path.resolve(`${cwd}/markup/${staticFolderName}/js/main.js`)\n    }),\n\n    output: {\n        path: path.resolve(`${(tars.isDevMode) ? `${tars.config.devPath}` : `${tars.options.build.path}`}/${staticFolderName}/js`),\n        publicPath: `./${staticFolderName}/js/`,\n        filename: `${outputFileNameTemplate}.js`\n    },\n\n    devtool: generateSourceMaps ? sourceMapsType : false,\n\n    watch: tars.options.watch.isActive && !tars.config.js.webpack.useHMR,\n\n    module: {\n        rules\n    },\n\n    plugins,\n\n    resolveLoader: {\n        modules: modulesDirectories\n    },\n\n    optimization: {\n        minimizer: minimizers\n    },\n\n    resolve: {\n        alias: {\n            modules: path.resolve(`./markup/${tars.config.fs.componentsFolderName}`),\n            components: path.resolve(`./markup/${tars.config.fs.componentsFolderName}`),\n            static: path.resolve(`./markup/${staticFolderName}`)\n        }\n    }\n};\n"
  }
]