├── .gitignore ├── README.md ├── assets └── console.png ├── bin └── bitrix-webpack ├── package-lock.json ├── package.json ├── src ├── cli.js ├── main.js └── snippets.js └── templates ├── css ├── build │ ├── config.development.js │ └── config.production.js └── package.json ├── default ├── .babelrc ├── .browserlistrc ├── build │ ├── config.base.js │ └── getWebpackAssets.php ├── custom │ ├── css │ │ └── example.css │ ├── img │ │ └── webpack.png │ ├── js │ │ └── hello_webpack.js │ └── vue │ │ ├── Example.vue │ │ ├── assets │ │ └── logo.png │ │ ├── components │ │ └── Hello.vue │ │ └── main.js └── src │ ├── webpack_custom.js │ └── webpack_vendor.js ├── sass ├── build │ ├── config.development.js │ └── config.production.js └── package.json └── test └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # bitrix-webpack 2 | bitrix-webpack — консольный инструмент для автоматического разворачивания Webpack в битрикс-приложении. 3 | Основная цель — упростить и автоматизировать первоначальную настройку Webpack для битрикс-проекта. 4 | 5 | ## Содержание 6 | 1. [Описание](#introduction) 7 | 2. [Установка](#install) 8 | 3. [Конфигурация](#config) 9 | 4. [Как пользоваться](#build) 10 | 11 |

Описание

12 | 13 | bitrix-webpack — одной командой разворачивает и настраивает сборщик проектов Webpack4 с установкой следующих CSS- и JS- фреймворков: 14 | 15 | - Webpack 4 16 | - js-фреймворк Vue 2 с примером 17 | - css-фреймворк Uikit 3 18 | - включить поддержку SASS 19 | - разделение css и js на вендорные и кастомные стили и скрипты 20 | - автоматически добавляются сниппеты, подключающие собранные webpack'ом файлы в `footer.php` и в `header.php` во все шаблоны, расположенные в `/bitrix/templates` и `/local/templates`. 21 | 22 | После установки Webpack будет настроен на транспиляцию в ES5, объединение и минификацию вендорных и кастомных для проекта js-скриптов. Объединение, минификацию и расстановку префиксов для css-стилей. Для обхода агрессивного браузерного кеширования к созданным webpack'ом файлам добавляется хэш в название. 23 | 24 | В итоге получится: 25 | 26 | ```html 27 | 28 | 29 | 30 | ``` 31 | 32 | ```html 33 | 34 | 35 | 36 | ``` 37 | 38 |

Установка

39 | 40 | 1. Перейдите в консоли в самую верхнюю директорию проекта. 41 | 2. **Важно.** Убедитесь, что нет файла `package.json`, так как скрипт его не перезаписывает, а только создает. 42 | 3. Установить 43 | 44 | ```bash 45 | $ npm install -g bitrix-webpack 46 | ``` 47 | 48 | Запустить с установкой всех зависимостей 49 | ```bash 50 | $ bitrix-webpack --install 51 | ``` 52 | 53 | Запустить без установки всех зависимостей. 54 | ```bash 55 | $ bitrix-webpack 56 | ``` 57 | 58 | Появится меню, где можно будет выбрать устанавливать поддержку SASS или нет: 59 | 60 | ![](https://github.com/sedovdmitry/bitrix-webpack/blob/master/assets/console.png?raw=true) 61 | 62 | 63 | В случае без запуска флага `--install` можно до установки зависимостей отредактировать `package.json`, удалить ненужные зависимости, добавить свои, и только потом установить зависимости: 64 | 65 | ```bash 66 | $ npm i 67 | ``` 68 | 69 | Если для каких-то шаблонов не нужно подключать стили и скрипты (например, для лендингов), генерируемые для основного сайта, то нужно будет зайти и удалить из этих шаблонов сниппеты, автоматически добавленными перед закрывающимися тегами `` и ``. 70 | 71 |

Конфигурация

72 | 73 | В структуру битрикс-проекта будут добавлены следующие директории и файлы: 74 | 75 | ``` 76 | /build/ 77 | config.base.js 78 | config.development.js 79 | config.production.js 80 | getWebpackAssets.php 81 | /custom/ 82 | /css/ 83 | example.css 84 | /img/ 85 | webpack.png 86 | /js/ 87 | hello_webpack.js 88 | /vue/ 89 | /assets/ 90 | logo.png 91 | /components/ 92 | Hello.vue 93 | Example.vue 94 | main.js 95 | /src/ 96 | webpack_custom.js 97 | webpack_vendor.js 98 | .babelrc 99 | .browserlistrc 100 | package.json 101 | 102 | ``` 103 | 104 | Где в `/build` содержатся настройки Webpack. 105 | 106 | В `/custom` содержатся кастомные стили и скрипты проекта. Есть пример с Vue. 107 | 108 | В `/src` импортируются js и css, которые забирать Webpack. В файле `/src/webpack_vendor.js` импортируйте js- и css- библиотеки, фреймворки, т.е. которые редко меняются: 109 | 110 | ```js 111 | // vendor styles 112 | import '../node_modules/uikit/dist/css/uikit.css' 113 | 114 | // vendor js 115 | // set uikit in global variable 116 | import UIkit from 'uikit' 117 | window.UIkit = UIkit; 118 | ``` 119 | 120 | В файл `/src/webpack_custom.js` импортируйте специфические для проекта стили и скрипты. 121 | 122 | Такое разделение на вендорные и кастомные файлы позволяет лишний раз не пересобирать Webpack'у редко изменяющиеся вендорные зависимости. 123 | 124 | ```js 125 | // styles 126 | import '../custom/css/example.css'; 127 | 128 | // js 129 | import '../custom/js/hello_webpack'; 130 | 131 | // vue 132 | import '../custom/vue/main'; 133 | ``` 134 | 135 | Посмотрите и исправьте если нужно файл `.browserlistrc`, чтобы добавить или убрать поддержку браузеров. По умолчанию включена поддержка браузеров, начиная с IE11. 136 | 137 |

Как пользоваться

138 | 139 | Для запуска сборки в режиме разработки выполните команду 140 | ```bash 141 | $ npm run dev 142 | ``` 143 | > Сборщик сгенерирует все файлы, указанные `/src/webpack_custom.js` и `/src/webpack_vendor.js` и начнет наблюдать за изменениями в реальном времени. 144 | 145 | Для запуска сборки в режиме продакшена 146 | ```bash 147 | $ npm run prod 148 | ``` 149 | > Сборщик сгенерирует все файлы, указанные `/src/webpack_custom.js` и `/src/webpack_vendor.js` и применит все оптимизации. 150 | -------------------------------------------------------------------------------- /assets/console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sedovdmitry/bitrix-webpack/c702ad256db2ce5d689d117313877fd027874ee5/assets/console.png -------------------------------------------------------------------------------- /bin/bitrix-webpack: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | require = require('esm')(module /*, options*/); 4 | require('../src/cli').cli(process.argv); -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bitrix-webpack", 3 | "version": "1.1.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@samverschueren/stream-to-observable": { 8 | "version": "0.3.0", 9 | "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", 10 | "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", 11 | "requires": { 12 | "any-observable": "^0.3.0" 13 | } 14 | }, 15 | "@types/color-name": { 16 | "version": "1.1.1", 17 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 18 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" 19 | }, 20 | "@types/execa": { 21 | "version": "0.9.0", 22 | "resolved": "https://registry.npmjs.org/@types/execa/-/execa-0.9.0.tgz", 23 | "integrity": "sha512-mgfd93RhzjYBUHHV532turHC2j4l/qxsF/PbfDmprHDEUHmNZGlDn1CEsulGK3AfsPdhkWzZQT/S/k0UGhLGsA==", 24 | "requires": { 25 | "@types/node": "*" 26 | } 27 | }, 28 | "@types/node": { 29 | "version": "11.15.3", 30 | "resolved": "https://registry.npmjs.org/@types/node/-/node-11.15.3.tgz", 31 | "integrity": "sha512-5RzvXVietaB8S4dwDjxjltAOHtTO87fiksjqjWGZih97j6KSrdCDaRfmYMNrgrLM87odGBrsTHAl6N3fLraQaw==" 32 | }, 33 | "abbrev": { 34 | "version": "1.1.1", 35 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 36 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 37 | }, 38 | "ansi-escapes": { 39 | "version": "4.3.0", 40 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", 41 | "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", 42 | "requires": { 43 | "type-fest": "^0.8.1" 44 | } 45 | }, 46 | "ansi-regex": { 47 | "version": "5.0.0", 48 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 49 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 50 | }, 51 | "ansi-styles": { 52 | "version": "4.2.0", 53 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.0.tgz", 54 | "integrity": "sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg==", 55 | "requires": { 56 | "@types/color-name": "^1.1.1", 57 | "color-convert": "^2.0.1" 58 | } 59 | }, 60 | "any-observable": { 61 | "version": "0.3.0", 62 | "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", 63 | "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==" 64 | }, 65 | "arg": { 66 | "version": "4.1.1", 67 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz", 68 | "integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==" 69 | }, 70 | "chalk": { 71 | "version": "3.0.0", 72 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 73 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 74 | "requires": { 75 | "ansi-styles": "^4.1.0", 76 | "supports-color": "^7.1.0" 77 | } 78 | }, 79 | "chardet": { 80 | "version": "0.7.0", 81 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 82 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 83 | }, 84 | "clear": { 85 | "version": "0.1.0", 86 | "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz", 87 | "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==" 88 | }, 89 | "cli-color": { 90 | "version": "0.3.2", 91 | "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.3.2.tgz", 92 | "integrity": "sha1-dfpfcowwjMSsWUsF4GzF2A2szYY=", 93 | "requires": { 94 | "d": "~0.1.1", 95 | "es5-ext": "~0.10.2", 96 | "memoizee": "0.3.x", 97 | "timers-ext": "0.1.x" 98 | } 99 | }, 100 | "cli-cursor": { 101 | "version": "3.1.0", 102 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 103 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 104 | "requires": { 105 | "restore-cursor": "^3.1.0" 106 | } 107 | }, 108 | "cli-truncate": { 109 | "version": "0.2.1", 110 | "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", 111 | "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", 112 | "requires": { 113 | "slice-ansi": "0.0.4", 114 | "string-width": "^1.0.1" 115 | }, 116 | "dependencies": { 117 | "ansi-regex": { 118 | "version": "2.1.1", 119 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 120 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 121 | }, 122 | "is-fullwidth-code-point": { 123 | "version": "1.0.0", 124 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 125 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 126 | "requires": { 127 | "number-is-nan": "^1.0.0" 128 | } 129 | }, 130 | "string-width": { 131 | "version": "1.0.2", 132 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 133 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 134 | "requires": { 135 | "code-point-at": "^1.0.0", 136 | "is-fullwidth-code-point": "^1.0.0", 137 | "strip-ansi": "^3.0.0" 138 | } 139 | }, 140 | "strip-ansi": { 141 | "version": "3.0.1", 142 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 143 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 144 | "requires": { 145 | "ansi-regex": "^2.0.0" 146 | } 147 | } 148 | } 149 | }, 150 | "cli-width": { 151 | "version": "2.2.0", 152 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 153 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" 154 | }, 155 | "clui": { 156 | "version": "0.3.6", 157 | "resolved": "https://registry.npmjs.org/clui/-/clui-0.3.6.tgz", 158 | "integrity": "sha512-Z4UbgZILlIAjkEkZiDOa2aoYjohKx7fa6DxIh6cE9A6WNWZ61iXfQc6CmdC9SKdS5nO0P0UyQ+WfoXfB65e3HQ==", 159 | "requires": { 160 | "cli-color": "0.3.2" 161 | } 162 | }, 163 | "code-point-at": { 164 | "version": "1.1.0", 165 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 166 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 167 | }, 168 | "color-convert": { 169 | "version": "2.0.1", 170 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 171 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 172 | "requires": { 173 | "color-name": "~1.1.4" 174 | } 175 | }, 176 | "color-name": { 177 | "version": "1.1.4", 178 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 179 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 180 | }, 181 | "configstore": { 182 | "version": "5.0.0", 183 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.0.tgz", 184 | "integrity": "sha512-eE/hvMs7qw7DlcB5JPRnthmrITuHMmACUJAp89v6PT6iOqzoLS7HRWhBtuHMlhNHo2AhUSA/3Dh1bKNJHcublQ==", 185 | "requires": { 186 | "dot-prop": "^5.1.0", 187 | "graceful-fs": "^4.1.2", 188 | "make-dir": "^3.0.0", 189 | "unique-string": "^2.0.0", 190 | "write-file-atomic": "^3.0.0", 191 | "xdg-basedir": "^4.0.0" 192 | } 193 | }, 194 | "cross-spawn": { 195 | "version": "7.0.1", 196 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", 197 | "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", 198 | "requires": { 199 | "path-key": "^3.1.0", 200 | "shebang-command": "^2.0.0", 201 | "which": "^2.0.1" 202 | } 203 | }, 204 | "crypto-random-string": { 205 | "version": "2.0.0", 206 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", 207 | "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" 208 | }, 209 | "d": { 210 | "version": "0.1.1", 211 | "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", 212 | "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", 213 | "requires": { 214 | "es5-ext": "~0.10.2" 215 | } 216 | }, 217 | "date-fns": { 218 | "version": "1.30.1", 219 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", 220 | "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" 221 | }, 222 | "dot-prop": { 223 | "version": "5.2.0", 224 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", 225 | "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", 226 | "requires": { 227 | "is-obj": "^2.0.0" 228 | } 229 | }, 230 | "elegant-spinner": { 231 | "version": "1.0.1", 232 | "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", 233 | "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=" 234 | }, 235 | "emoji-regex": { 236 | "version": "8.0.0", 237 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 238 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 239 | }, 240 | "end-of-stream": { 241 | "version": "1.4.4", 242 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 243 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 244 | "requires": { 245 | "once": "^1.4.0" 246 | } 247 | }, 248 | "es5-ext": { 249 | "version": "0.10.53", 250 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", 251 | "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", 252 | "requires": { 253 | "es6-iterator": "~2.0.3", 254 | "es6-symbol": "~3.1.3", 255 | "next-tick": "~1.0.0" 256 | } 257 | }, 258 | "es6-iterator": { 259 | "version": "2.0.3", 260 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", 261 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", 262 | "requires": { 263 | "d": "1", 264 | "es5-ext": "^0.10.35", 265 | "es6-symbol": "^3.1.1" 266 | }, 267 | "dependencies": { 268 | "d": { 269 | "version": "1.0.1", 270 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", 271 | "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", 272 | "requires": { 273 | "es5-ext": "^0.10.50", 274 | "type": "^1.0.1" 275 | } 276 | } 277 | } 278 | }, 279 | "es6-symbol": { 280 | "version": "3.1.3", 281 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", 282 | "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", 283 | "requires": { 284 | "d": "^1.0.1", 285 | "ext": "^1.1.2" 286 | }, 287 | "dependencies": { 288 | "d": { 289 | "version": "1.0.1", 290 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", 291 | "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", 292 | "requires": { 293 | "es5-ext": "^0.10.50", 294 | "type": "^1.0.1" 295 | } 296 | } 297 | } 298 | }, 299 | "es6-weak-map": { 300 | "version": "0.1.4", 301 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", 302 | "integrity": "sha1-cGzvnpmqI2undmwjnIueKG6n0ig=", 303 | "requires": { 304 | "d": "~0.1.1", 305 | "es5-ext": "~0.10.6", 306 | "es6-iterator": "~0.1.3", 307 | "es6-symbol": "~2.0.1" 308 | }, 309 | "dependencies": { 310 | "es6-iterator": { 311 | "version": "0.1.3", 312 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", 313 | "integrity": "sha1-1vWLjE/EE8JJtLqhl2j45NfIlE4=", 314 | "requires": { 315 | "d": "~0.1.1", 316 | "es5-ext": "~0.10.5", 317 | "es6-symbol": "~2.0.1" 318 | } 319 | }, 320 | "es6-symbol": { 321 | "version": "2.0.1", 322 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", 323 | "integrity": "sha1-dhtcZ8/U8dGK+yNPaR1nhoLLO/M=", 324 | "requires": { 325 | "d": "~0.1.1", 326 | "es5-ext": "~0.10.5" 327 | } 328 | } 329 | } 330 | }, 331 | "escape-string-regexp": { 332 | "version": "1.0.5", 333 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 334 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 335 | }, 336 | "esm": { 337 | "version": "3.2.25", 338 | "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", 339 | "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" 340 | }, 341 | "event-emitter": { 342 | "version": "0.3.5", 343 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 344 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", 345 | "requires": { 346 | "d": "1", 347 | "es5-ext": "~0.10.14" 348 | }, 349 | "dependencies": { 350 | "d": { 351 | "version": "1.0.1", 352 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", 353 | "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", 354 | "requires": { 355 | "es5-ext": "^0.10.50", 356 | "type": "^1.0.1" 357 | } 358 | } 359 | } 360 | }, 361 | "execa": { 362 | "version": "3.4.0", 363 | "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", 364 | "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", 365 | "requires": { 366 | "cross-spawn": "^7.0.0", 367 | "get-stream": "^5.0.0", 368 | "human-signals": "^1.1.1", 369 | "is-stream": "^2.0.0", 370 | "merge-stream": "^2.0.0", 371 | "npm-run-path": "^4.0.0", 372 | "onetime": "^5.1.0", 373 | "p-finally": "^2.0.0", 374 | "signal-exit": "^3.0.2", 375 | "strip-final-newline": "^2.0.0" 376 | } 377 | }, 378 | "ext": { 379 | "version": "1.2.0", 380 | "resolved": "https://registry.npmjs.org/ext/-/ext-1.2.0.tgz", 381 | "integrity": "sha512-0ccUQK/9e3NreLFg6K6np8aPyRgwycx+oFGtfx1dSp7Wj00Ozw9r05FgBRlzjf2XBM7LAzwgLyDscRrtSU91hA==", 382 | "requires": { 383 | "type": "^2.0.0" 384 | }, 385 | "dependencies": { 386 | "type": { 387 | "version": "2.0.0", 388 | "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", 389 | "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" 390 | } 391 | } 392 | }, 393 | "external-editor": { 394 | "version": "3.1.0", 395 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 396 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 397 | "requires": { 398 | "chardet": "^0.7.0", 399 | "iconv-lite": "^0.4.24", 400 | "tmp": "^0.0.33" 401 | } 402 | }, 403 | "figlet": { 404 | "version": "1.2.4", 405 | "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.2.4.tgz", 406 | "integrity": "sha512-mv8YA9RruB4C5QawPaD29rEVx3N97ZTyNrE4DAfbhuo6tpcMdKnPVo8MlyT3RP5uPcg5M14bEJBq7kjFf4kAWg==" 407 | }, 408 | "figures": { 409 | "version": "3.1.0", 410 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", 411 | "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", 412 | "requires": { 413 | "escape-string-regexp": "^1.0.5" 414 | } 415 | }, 416 | "get-stream": { 417 | "version": "5.1.0", 418 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", 419 | "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", 420 | "requires": { 421 | "pump": "^3.0.0" 422 | } 423 | }, 424 | "graceful-fs": { 425 | "version": "4.2.3", 426 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 427 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" 428 | }, 429 | "has-ansi": { 430 | "version": "2.0.0", 431 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 432 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 433 | "requires": { 434 | "ansi-regex": "^2.0.0" 435 | }, 436 | "dependencies": { 437 | "ansi-regex": { 438 | "version": "2.1.1", 439 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 440 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 441 | } 442 | } 443 | }, 444 | "has-flag": { 445 | "version": "4.0.0", 446 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 447 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 448 | }, 449 | "human-signals": { 450 | "version": "1.1.1", 451 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", 452 | "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" 453 | }, 454 | "iconv-lite": { 455 | "version": "0.4.24", 456 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 457 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 458 | "requires": { 459 | "safer-buffer": ">= 2.1.2 < 3" 460 | } 461 | }, 462 | "imurmurhash": { 463 | "version": "0.1.4", 464 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 465 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 466 | }, 467 | "indent-string": { 468 | "version": "3.2.0", 469 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", 470 | "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" 471 | }, 472 | "inquirer": { 473 | "version": "7.0.0", 474 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", 475 | "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", 476 | "requires": { 477 | "ansi-escapes": "^4.2.1", 478 | "chalk": "^2.4.2", 479 | "cli-cursor": "^3.1.0", 480 | "cli-width": "^2.0.0", 481 | "external-editor": "^3.0.3", 482 | "figures": "^3.0.0", 483 | "lodash": "^4.17.15", 484 | "mute-stream": "0.0.8", 485 | "run-async": "^2.2.0", 486 | "rxjs": "^6.4.0", 487 | "string-width": "^4.1.0", 488 | "strip-ansi": "^5.1.0", 489 | "through": "^2.3.6" 490 | }, 491 | "dependencies": { 492 | "ansi-styles": { 493 | "version": "3.2.1", 494 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 495 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 496 | "requires": { 497 | "color-convert": "^1.9.0" 498 | } 499 | }, 500 | "chalk": { 501 | "version": "2.4.2", 502 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 503 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 504 | "requires": { 505 | "ansi-styles": "^3.2.1", 506 | "escape-string-regexp": "^1.0.5", 507 | "supports-color": "^5.3.0" 508 | } 509 | }, 510 | "color-convert": { 511 | "version": "1.9.3", 512 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 513 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 514 | "requires": { 515 | "color-name": "1.1.3" 516 | } 517 | }, 518 | "color-name": { 519 | "version": "1.1.3", 520 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 521 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 522 | }, 523 | "has-flag": { 524 | "version": "3.0.0", 525 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 526 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 527 | }, 528 | "supports-color": { 529 | "version": "5.5.0", 530 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 531 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 532 | "requires": { 533 | "has-flag": "^3.0.0" 534 | } 535 | } 536 | } 537 | }, 538 | "is-fullwidth-code-point": { 539 | "version": "3.0.0", 540 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 541 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 542 | }, 543 | "is-obj": { 544 | "version": "2.0.0", 545 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", 546 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" 547 | }, 548 | "is-observable": { 549 | "version": "1.1.0", 550 | "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", 551 | "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", 552 | "requires": { 553 | "symbol-observable": "^1.1.0" 554 | } 555 | }, 556 | "is-promise": { 557 | "version": "2.1.0", 558 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 559 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 560 | }, 561 | "is-stream": { 562 | "version": "2.0.0", 563 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", 564 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" 565 | }, 566 | "is-typedarray": { 567 | "version": "1.0.0", 568 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 569 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 570 | }, 571 | "isexe": { 572 | "version": "2.0.0", 573 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 574 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 575 | }, 576 | "listr": { 577 | "version": "0.14.3", 578 | "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", 579 | "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", 580 | "requires": { 581 | "@samverschueren/stream-to-observable": "^0.3.0", 582 | "is-observable": "^1.1.0", 583 | "is-promise": "^2.1.0", 584 | "is-stream": "^1.1.0", 585 | "listr-silent-renderer": "^1.1.1", 586 | "listr-update-renderer": "^0.5.0", 587 | "listr-verbose-renderer": "^0.5.0", 588 | "p-map": "^2.0.0", 589 | "rxjs": "^6.3.3" 590 | }, 591 | "dependencies": { 592 | "is-stream": { 593 | "version": "1.1.0", 594 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 595 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 596 | } 597 | } 598 | }, 599 | "listr-silent-renderer": { 600 | "version": "1.1.1", 601 | "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", 602 | "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=" 603 | }, 604 | "listr-update-renderer": { 605 | "version": "0.5.0", 606 | "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", 607 | "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", 608 | "requires": { 609 | "chalk": "^1.1.3", 610 | "cli-truncate": "^0.2.1", 611 | "elegant-spinner": "^1.0.1", 612 | "figures": "^1.7.0", 613 | "indent-string": "^3.0.0", 614 | "log-symbols": "^1.0.2", 615 | "log-update": "^2.3.0", 616 | "strip-ansi": "^3.0.1" 617 | }, 618 | "dependencies": { 619 | "ansi-regex": { 620 | "version": "2.1.1", 621 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 622 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 623 | }, 624 | "ansi-styles": { 625 | "version": "2.2.1", 626 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 627 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 628 | }, 629 | "chalk": { 630 | "version": "1.1.3", 631 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 632 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 633 | "requires": { 634 | "ansi-styles": "^2.2.1", 635 | "escape-string-regexp": "^1.0.2", 636 | "has-ansi": "^2.0.0", 637 | "strip-ansi": "^3.0.0", 638 | "supports-color": "^2.0.0" 639 | } 640 | }, 641 | "figures": { 642 | "version": "1.7.0", 643 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 644 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 645 | "requires": { 646 | "escape-string-regexp": "^1.0.5", 647 | "object-assign": "^4.1.0" 648 | } 649 | }, 650 | "strip-ansi": { 651 | "version": "3.0.1", 652 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 653 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 654 | "requires": { 655 | "ansi-regex": "^2.0.0" 656 | } 657 | }, 658 | "supports-color": { 659 | "version": "2.0.0", 660 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 661 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 662 | } 663 | } 664 | }, 665 | "listr-verbose-renderer": { 666 | "version": "0.5.0", 667 | "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", 668 | "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", 669 | "requires": { 670 | "chalk": "^2.4.1", 671 | "cli-cursor": "^2.1.0", 672 | "date-fns": "^1.27.2", 673 | "figures": "^2.0.0" 674 | }, 675 | "dependencies": { 676 | "ansi-styles": { 677 | "version": "3.2.1", 678 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 679 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 680 | "requires": { 681 | "color-convert": "^1.9.0" 682 | } 683 | }, 684 | "chalk": { 685 | "version": "2.4.2", 686 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 687 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 688 | "requires": { 689 | "ansi-styles": "^3.2.1", 690 | "escape-string-regexp": "^1.0.5", 691 | "supports-color": "^5.3.0" 692 | } 693 | }, 694 | "cli-cursor": { 695 | "version": "2.1.0", 696 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 697 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 698 | "requires": { 699 | "restore-cursor": "^2.0.0" 700 | } 701 | }, 702 | "color-convert": { 703 | "version": "1.9.3", 704 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 705 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 706 | "requires": { 707 | "color-name": "1.1.3" 708 | } 709 | }, 710 | "color-name": { 711 | "version": "1.1.3", 712 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 713 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 714 | }, 715 | "figures": { 716 | "version": "2.0.0", 717 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 718 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 719 | "requires": { 720 | "escape-string-regexp": "^1.0.5" 721 | } 722 | }, 723 | "has-flag": { 724 | "version": "3.0.0", 725 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 726 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 727 | }, 728 | "mimic-fn": { 729 | "version": "1.2.0", 730 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 731 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" 732 | }, 733 | "onetime": { 734 | "version": "2.0.1", 735 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 736 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 737 | "requires": { 738 | "mimic-fn": "^1.0.0" 739 | } 740 | }, 741 | "restore-cursor": { 742 | "version": "2.0.0", 743 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 744 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 745 | "requires": { 746 | "onetime": "^2.0.0", 747 | "signal-exit": "^3.0.2" 748 | } 749 | }, 750 | "supports-color": { 751 | "version": "5.5.0", 752 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 753 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 754 | "requires": { 755 | "has-flag": "^3.0.0" 756 | } 757 | } 758 | } 759 | }, 760 | "lodash": { 761 | "version": "4.17.21", 762 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 763 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 764 | }, 765 | "log-symbols": { 766 | "version": "1.0.2", 767 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", 768 | "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", 769 | "requires": { 770 | "chalk": "^1.0.0" 771 | }, 772 | "dependencies": { 773 | "ansi-regex": { 774 | "version": "2.1.1", 775 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 776 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 777 | }, 778 | "ansi-styles": { 779 | "version": "2.2.1", 780 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 781 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 782 | }, 783 | "chalk": { 784 | "version": "1.1.3", 785 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 786 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 787 | "requires": { 788 | "ansi-styles": "^2.2.1", 789 | "escape-string-regexp": "^1.0.2", 790 | "has-ansi": "^2.0.0", 791 | "strip-ansi": "^3.0.0", 792 | "supports-color": "^2.0.0" 793 | } 794 | }, 795 | "strip-ansi": { 796 | "version": "3.0.1", 797 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 798 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 799 | "requires": { 800 | "ansi-regex": "^2.0.0" 801 | } 802 | }, 803 | "supports-color": { 804 | "version": "2.0.0", 805 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 806 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 807 | } 808 | } 809 | }, 810 | "log-update": { 811 | "version": "2.3.0", 812 | "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", 813 | "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", 814 | "requires": { 815 | "ansi-escapes": "^3.0.0", 816 | "cli-cursor": "^2.0.0", 817 | "wrap-ansi": "^3.0.1" 818 | }, 819 | "dependencies": { 820 | "ansi-escapes": { 821 | "version": "3.2.0", 822 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 823 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" 824 | }, 825 | "cli-cursor": { 826 | "version": "2.1.0", 827 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 828 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 829 | "requires": { 830 | "restore-cursor": "^2.0.0" 831 | } 832 | }, 833 | "mimic-fn": { 834 | "version": "1.2.0", 835 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 836 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" 837 | }, 838 | "onetime": { 839 | "version": "2.0.1", 840 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 841 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 842 | "requires": { 843 | "mimic-fn": "^1.0.0" 844 | } 845 | }, 846 | "restore-cursor": { 847 | "version": "2.0.0", 848 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 849 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 850 | "requires": { 851 | "onetime": "^2.0.0", 852 | "signal-exit": "^3.0.2" 853 | } 854 | } 855 | } 856 | }, 857 | "lru-queue": { 858 | "version": "0.1.0", 859 | "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", 860 | "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", 861 | "requires": { 862 | "es5-ext": "~0.10.2" 863 | } 864 | }, 865 | "make-dir": { 866 | "version": "3.0.0", 867 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", 868 | "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", 869 | "requires": { 870 | "semver": "^6.0.0" 871 | } 872 | }, 873 | "memoizee": { 874 | "version": "0.3.10", 875 | "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", 876 | "integrity": "sha1-TsoNiu057J0Bf0xcLy9kMvQuXI8=", 877 | "requires": { 878 | "d": "~0.1.1", 879 | "es5-ext": "~0.10.11", 880 | "es6-weak-map": "~0.1.4", 881 | "event-emitter": "~0.3.4", 882 | "lru-queue": "0.1", 883 | "next-tick": "~0.2.2", 884 | "timers-ext": "0.1" 885 | }, 886 | "dependencies": { 887 | "next-tick": { 888 | "version": "0.2.2", 889 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", 890 | "integrity": "sha1-ddpKkn7liH45BliABltzNkE7MQ0=" 891 | } 892 | } 893 | }, 894 | "merge-stream": { 895 | "version": "2.0.0", 896 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 897 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" 898 | }, 899 | "mimic-fn": { 900 | "version": "2.1.0", 901 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 902 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 903 | }, 904 | "minimist": { 905 | "version": "1.2.5", 906 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 907 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 908 | }, 909 | "mute-stream": { 910 | "version": "0.0.8", 911 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 912 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 913 | }, 914 | "ncp": { 915 | "version": "2.0.0", 916 | "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", 917 | "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" 918 | }, 919 | "next-tick": { 920 | "version": "1.0.0", 921 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", 922 | "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" 923 | }, 924 | "nice-try": { 925 | "version": "1.0.5", 926 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 927 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 928 | }, 929 | "nopt": { 930 | "version": "1.0.10", 931 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 932 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 933 | "requires": { 934 | "abbrev": "1" 935 | } 936 | }, 937 | "npm-run-path": { 938 | "version": "4.0.0", 939 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.0.tgz", 940 | "integrity": "sha512-8eyAOAH+bYXFPSnNnKr3J+yoybe8O87Is5rtAQ8qRczJz1ajcsjg8l2oZqP+Ppx15Ii3S1vUTjQN2h4YO2tWWQ==", 941 | "requires": { 942 | "path-key": "^3.0.0" 943 | } 944 | }, 945 | "number-is-nan": { 946 | "version": "1.0.1", 947 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 948 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 949 | }, 950 | "object-assign": { 951 | "version": "4.1.1", 952 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 953 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 954 | }, 955 | "once": { 956 | "version": "1.4.0", 957 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 958 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 959 | "requires": { 960 | "wrappy": "1" 961 | } 962 | }, 963 | "onetime": { 964 | "version": "5.1.0", 965 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 966 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 967 | "requires": { 968 | "mimic-fn": "^2.1.0" 969 | } 970 | }, 971 | "os-tmpdir": { 972 | "version": "1.0.2", 973 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 974 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 975 | }, 976 | "p-finally": { 977 | "version": "2.0.1", 978 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", 979 | "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" 980 | }, 981 | "p-map": { 982 | "version": "2.1.0", 983 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", 984 | "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" 985 | }, 986 | "path-key": { 987 | "version": "3.1.1", 988 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 989 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" 990 | }, 991 | "pkg-install": { 992 | "version": "1.0.0", 993 | "resolved": "https://registry.npmjs.org/pkg-install/-/pkg-install-1.0.0.tgz", 994 | "integrity": "sha512-UGI8bfhrDb1KN01RZ7Bq08GRQc8rmVjxQ2up0g4mUHPCYDTK1FzQ0PMmLOBCHg3yaIijZ2U3Fn9ofLa4N392Ug==", 995 | "requires": { 996 | "@types/execa": "^0.9.0", 997 | "@types/node": "^11.9.4", 998 | "execa": "^1.0.0" 999 | }, 1000 | "dependencies": { 1001 | "cross-spawn": { 1002 | "version": "6.0.5", 1003 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 1004 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 1005 | "requires": { 1006 | "nice-try": "^1.0.4", 1007 | "path-key": "^2.0.1", 1008 | "semver": "^5.5.0", 1009 | "shebang-command": "^1.2.0", 1010 | "which": "^1.2.9" 1011 | } 1012 | }, 1013 | "execa": { 1014 | "version": "1.0.0", 1015 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 1016 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 1017 | "requires": { 1018 | "cross-spawn": "^6.0.0", 1019 | "get-stream": "^4.0.0", 1020 | "is-stream": "^1.1.0", 1021 | "npm-run-path": "^2.0.0", 1022 | "p-finally": "^1.0.0", 1023 | "signal-exit": "^3.0.0", 1024 | "strip-eof": "^1.0.0" 1025 | } 1026 | }, 1027 | "get-stream": { 1028 | "version": "4.1.0", 1029 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 1030 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 1031 | "requires": { 1032 | "pump": "^3.0.0" 1033 | } 1034 | }, 1035 | "is-stream": { 1036 | "version": "1.1.0", 1037 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1038 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 1039 | }, 1040 | "npm-run-path": { 1041 | "version": "2.0.2", 1042 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1043 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1044 | "requires": { 1045 | "path-key": "^2.0.0" 1046 | } 1047 | }, 1048 | "p-finally": { 1049 | "version": "1.0.0", 1050 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1051 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 1052 | }, 1053 | "path-key": { 1054 | "version": "2.0.1", 1055 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1056 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 1057 | }, 1058 | "semver": { 1059 | "version": "5.7.1", 1060 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1061 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1062 | }, 1063 | "shebang-command": { 1064 | "version": "1.2.0", 1065 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1066 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1067 | "requires": { 1068 | "shebang-regex": "^1.0.0" 1069 | } 1070 | }, 1071 | "shebang-regex": { 1072 | "version": "1.0.0", 1073 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1074 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 1075 | }, 1076 | "which": { 1077 | "version": "1.3.1", 1078 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1079 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1080 | "requires": { 1081 | "isexe": "^2.0.0" 1082 | } 1083 | } 1084 | } 1085 | }, 1086 | "pump": { 1087 | "version": "3.0.0", 1088 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1089 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1090 | "requires": { 1091 | "end-of-stream": "^1.1.0", 1092 | "once": "^1.3.1" 1093 | } 1094 | }, 1095 | "restore-cursor": { 1096 | "version": "3.1.0", 1097 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1098 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1099 | "requires": { 1100 | "onetime": "^5.1.0", 1101 | "signal-exit": "^3.0.2" 1102 | } 1103 | }, 1104 | "run-async": { 1105 | "version": "2.3.0", 1106 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 1107 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1108 | "requires": { 1109 | "is-promise": "^2.1.0" 1110 | } 1111 | }, 1112 | "rxjs": { 1113 | "version": "6.5.3", 1114 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", 1115 | "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", 1116 | "requires": { 1117 | "tslib": "^1.9.0" 1118 | } 1119 | }, 1120 | "safer-buffer": { 1121 | "version": "2.1.2", 1122 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1123 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1124 | }, 1125 | "semver": { 1126 | "version": "6.3.0", 1127 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1128 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1129 | }, 1130 | "shebang-command": { 1131 | "version": "2.0.0", 1132 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1133 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1134 | "requires": { 1135 | "shebang-regex": "^3.0.0" 1136 | } 1137 | }, 1138 | "shebang-regex": { 1139 | "version": "3.0.0", 1140 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1141 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" 1142 | }, 1143 | "signal-exit": { 1144 | "version": "3.0.2", 1145 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1146 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 1147 | }, 1148 | "slice-ansi": { 1149 | "version": "0.0.4", 1150 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", 1151 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" 1152 | }, 1153 | "string-width": { 1154 | "version": "4.2.0", 1155 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 1156 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 1157 | "requires": { 1158 | "emoji-regex": "^8.0.0", 1159 | "is-fullwidth-code-point": "^3.0.0", 1160 | "strip-ansi": "^6.0.0" 1161 | }, 1162 | "dependencies": { 1163 | "strip-ansi": { 1164 | "version": "6.0.0", 1165 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1166 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1167 | "requires": { 1168 | "ansi-regex": "^5.0.0" 1169 | } 1170 | } 1171 | } 1172 | }, 1173 | "strip-ansi": { 1174 | "version": "5.2.0", 1175 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1176 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1177 | "requires": { 1178 | "ansi-regex": "^4.1.0" 1179 | }, 1180 | "dependencies": { 1181 | "ansi-regex": { 1182 | "version": "4.1.0", 1183 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1184 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 1185 | } 1186 | } 1187 | }, 1188 | "strip-eof": { 1189 | "version": "1.0.0", 1190 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 1191 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 1192 | }, 1193 | "strip-final-newline": { 1194 | "version": "2.0.0", 1195 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 1196 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" 1197 | }, 1198 | "supports-color": { 1199 | "version": "7.1.0", 1200 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 1201 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 1202 | "requires": { 1203 | "has-flag": "^4.0.0" 1204 | } 1205 | }, 1206 | "symbol-observable": { 1207 | "version": "1.2.0", 1208 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", 1209 | "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" 1210 | }, 1211 | "through": { 1212 | "version": "2.3.8", 1213 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1214 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 1215 | }, 1216 | "timers-ext": { 1217 | "version": "0.1.7", 1218 | "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", 1219 | "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", 1220 | "requires": { 1221 | "es5-ext": "~0.10.46", 1222 | "next-tick": "1" 1223 | } 1224 | }, 1225 | "tmp": { 1226 | "version": "0.0.33", 1227 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1228 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1229 | "requires": { 1230 | "os-tmpdir": "~1.0.2" 1231 | } 1232 | }, 1233 | "touch": { 1234 | "version": "3.1.0", 1235 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1236 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1237 | "requires": { 1238 | "nopt": "~1.0.10" 1239 | } 1240 | }, 1241 | "tslib": { 1242 | "version": "1.10.0", 1243 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 1244 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" 1245 | }, 1246 | "type": { 1247 | "version": "1.2.0", 1248 | "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", 1249 | "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" 1250 | }, 1251 | "type-fest": { 1252 | "version": "0.8.1", 1253 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 1254 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" 1255 | }, 1256 | "typedarray-to-buffer": { 1257 | "version": "3.1.5", 1258 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 1259 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 1260 | "requires": { 1261 | "is-typedarray": "^1.0.0" 1262 | } 1263 | }, 1264 | "unique-string": { 1265 | "version": "2.0.0", 1266 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", 1267 | "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", 1268 | "requires": { 1269 | "crypto-random-string": "^2.0.0" 1270 | } 1271 | }, 1272 | "which": { 1273 | "version": "2.0.2", 1274 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1275 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1276 | "requires": { 1277 | "isexe": "^2.0.0" 1278 | } 1279 | }, 1280 | "wrap-ansi": { 1281 | "version": "3.0.1", 1282 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", 1283 | "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", 1284 | "requires": { 1285 | "string-width": "^2.1.1", 1286 | "strip-ansi": "^4.0.0" 1287 | }, 1288 | "dependencies": { 1289 | "ansi-regex": { 1290 | "version": "3.0.0", 1291 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1292 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 1293 | }, 1294 | "is-fullwidth-code-point": { 1295 | "version": "2.0.0", 1296 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1297 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 1298 | }, 1299 | "string-width": { 1300 | "version": "2.1.1", 1301 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1302 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1303 | "requires": { 1304 | "is-fullwidth-code-point": "^2.0.0", 1305 | "strip-ansi": "^4.0.0" 1306 | } 1307 | }, 1308 | "strip-ansi": { 1309 | "version": "4.0.0", 1310 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1311 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1312 | "requires": { 1313 | "ansi-regex": "^3.0.0" 1314 | } 1315 | } 1316 | } 1317 | }, 1318 | "wrappy": { 1319 | "version": "1.0.2", 1320 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1321 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1322 | }, 1323 | "write-file-atomic": { 1324 | "version": "3.0.1", 1325 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", 1326 | "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", 1327 | "requires": { 1328 | "imurmurhash": "^0.1.4", 1329 | "is-typedarray": "^1.0.0", 1330 | "signal-exit": "^3.0.2", 1331 | "typedarray-to-buffer": "^3.1.5" 1332 | } 1333 | }, 1334 | "xdg-basedir": { 1335 | "version": "4.0.0", 1336 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", 1337 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" 1338 | } 1339 | } 1340 | } 1341 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bitrix-webpack", 3 | "version": "1.1.1", 4 | "description": "Автоматическая подготовка и настройка Webpack4 для Bitrix", 5 | "main": "src/index.js", 6 | "bin": { 7 | "bitrix-webpack": "bin/bitrix-webpack" 8 | }, 9 | "publishConfig": { 10 | "access": "public" 11 | }, 12 | "scripts": { 13 | "test": "echo \"Error: no test specified\" && exit 1" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "git+https://github.com/sedovdmitry/bitrix-template.git" 18 | }, 19 | "keywords": [ 20 | "bitrix", 21 | "webpack4", 22 | "cli", 23 | "vue2", 24 | "es6", 25 | "uikit3", 26 | "sass" 27 | ], 28 | "author": "Dmitry Sedov ", 29 | "license": "MIT", 30 | "bugs": { 31 | "url": "https://github.com/sedovdmitry/bitrix-template/issues" 32 | }, 33 | "homepage": "https://github.com/sedovdmitry/bitrix-template#readme", 34 | "engines": { 35 | "node": ">=10.10.0", 36 | "npm": ">=6.0.0" 37 | }, 38 | "dependencies": { 39 | "arg": "^4.1.1", 40 | "chalk": "^3.0.0", 41 | "clear": "^0.1.0", 42 | "clui": "^0.3.6", 43 | "configstore": "^5.0.0", 44 | "esm": "^3.2.25", 45 | "execa": "^3.4.0", 46 | "figlet": "^1.2.4", 47 | "inquirer": "^7.0.0", 48 | "listr": "^0.14.3", 49 | "lodash": "^4.17.19", 50 | "minimist": "^1.2.3", 51 | "ncp": "^2.0.0", 52 | "pkg-install": "^1.0.0", 53 | "touch": "^3.1.0" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/cli.js: -------------------------------------------------------------------------------- 1 | import chalk from 'chalk'; 2 | import clear from 'clear'; 3 | import figlet from 'figlet'; 4 | import inquirer from 'inquirer'; 5 | import arg from 'arg'; 6 | import { createProject } from './main' 7 | 8 | function parseArgumentsIntoOptions(rawArgs) { 9 | const args = arg ( 10 | { 11 | '--yes': Boolean, 12 | '--install': Boolean, 13 | '-y': '--yes', 14 | '-i': '--install', 15 | }, 16 | { 17 | argv: rawArgs.slice(2), 18 | } 19 | ); 20 | return { 21 | skipPrompts: args['--yes'] || false, 22 | runInstall: args['--install'] || false, 23 | template: args._[0], 24 | }; 25 | } 26 | 27 | async function promtForMissingOptions(options) { 28 | const defaultTemplate = 'CSS'; 29 | if (options.skipPrompts) { 30 | return { 31 | ...options, 32 | template: options.template || defaultTemplate, 33 | } 34 | } 35 | 36 | const questions = []; 37 | if (!options.template) { 38 | questions.push({ 39 | type: 'list', 40 | name: 'template', 41 | message: 'Please choose SASS or without css-preprocessor to use', 42 | choices: ['CSS', 'SASS'], 43 | default: defaultTemplate, 44 | }) 45 | } 46 | 47 | const answers = await inquirer.prompt(questions); 48 | return { 49 | ...options, 50 | template: options.template || answers.template, 51 | } 52 | } 53 | 54 | export async function cli(args) { 55 | let options = parseArgumentsIntoOptions(args); 56 | options = await promtForMissingOptions(options); 57 | await createProject(options); 58 | } 59 | 60 | clear(); 61 | 62 | console.log( 63 | chalk.yellow( 64 | figlet.textSync('BitrixWebpack', { horizontalLayout: 'full' }) 65 | ) 66 | ); 67 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import chalk from 'chalk'; 2 | import fs, { readdirSync } from 'fs'; 3 | import ncp from 'ncp'; 4 | import path from 'path'; 5 | import { promisify } from 'util'; 6 | import execa from 'execa'; 7 | import Listr from 'listr'; 8 | import { projectInstall } from 'pkg-install'; 9 | import { headerSnippet, footerSnippet } from './snippets'; 10 | 11 | const access = promisify(fs.access); 12 | const copy = promisify(ncp); 13 | 14 | let bitrixDirs = []; 15 | let localDirs = []; 16 | 17 | async function copyTemplateFiles(options) { 18 | return copy (options.templateDirectory, options.targetDirectory, { 19 | clobber: false, 20 | }); 21 | } 22 | 23 | async function copyDefaultFiles(options) { 24 | return copy (options.defaultDirectory, options.targetDirectory, { 25 | clobber: false, 26 | }); 27 | } 28 | 29 | function getAllDirectoriesFrom(options, directory) { 30 | const source = path.resolve(options.targetDirectory, directory); 31 | 32 | const getDirectories = source => { 33 | try { 34 | return readdirSync(source, { withFileTypes: true }) 35 | .filter(dirent => dirent.isDirectory()) 36 | .map(dirent => dirent.name) 37 | } catch (err) { 38 | console.error(chalk.yellow.bold('Warning'), `directories not founded in ${source}`); 39 | } 40 | } 41 | 42 | const dirs = getDirectories(source) !== undefined ? getDirectories(source) : []; 43 | if (dirs.length) { 44 | console.log(chalk.blue.bold('Notice'), `founded template directories ${dirs} in ${source}`); 45 | } 46 | return dirs; 47 | } 48 | 49 | async function updateBitrixTemplates(parentTargetDir, dirs, filename, replace, addSnippet) { 50 | for (const dirname of dirs) { 51 | await addToBitrixTemplate(parentTargetDir, dirname, filename, replace, addSnippet); 52 | } 53 | } 54 | 55 | async function addToBitrixTemplate(parentTargetDir, dirname, filename, replace, addSnippet) { 56 | const re = new RegExp(replace,"g"); 57 | 58 | fs.readFile(path.resolve(parentTargetDir, dirname, filename), 'UTF-8', function(err, data) { 59 | if(err) 60 | console.error(chalk.blue.bold('Notice'), `file ${filename} not founded in ${parentTargetDir}/${dirname}`); 61 | else { 62 | if (/="\/dist\/<\?=\$GLOBALS/gim.test(data)) { 63 | console.error(chalk.red.bold('Attention'), `snippet was added before in ${parentTargetDir}/${dirname}/${filename}`); 64 | } else { 65 | let result = data.replace(re, addSnippet); 66 | console.error(chalk.green.bold('Writed'), path.resolve(parentTargetDir, dirname, filename)); 67 | fs.writeFile(path.resolve(parentTargetDir, dirname, filename), result, 'utf8', function (err) { 68 | if (err) return console.error(chalk.blue.bold('Error'), `When write file ${filename} in ${parentTargetDir}/${dirname}`); 69 | }); 70 | } 71 | } 72 | }); 73 | } 74 | 75 | function runUpdate(bitrixTargetDirectory, localTargetDirectory) { 76 | updateBitrixTemplates(bitrixTargetDirectory, bitrixDirs, 'header.php', '', headerSnippet); 77 | updateBitrixTemplates(bitrixTargetDirectory, bitrixDirs, 'footer.php', '', footerSnippet); 78 | updateBitrixTemplates(localTargetDirectory, localDirs, 'header.php', '', headerSnippet); 79 | updateBitrixTemplates(localTargetDirectory, localDirs, 'footer.php', '', footerSnippet); 80 | } 81 | 82 | export async function createProject(options) { 83 | options = { 84 | ...options, 85 | targetDirectory: options.targetDirectory || process.cwd(), 86 | } 87 | 88 | const currentFileUrl = import.meta.url; 89 | const templateDir = path.resolve( 90 | new URL(currentFileUrl).pathname, 91 | '../../templates', 92 | options.template.toLowerCase() 93 | ); 94 | const defaultDir = path.resolve( 95 | new URL(currentFileUrl).pathname, 96 | '../../templates', 97 | 'default' 98 | ); 99 | 100 | options.templateDirectory = templateDir; 101 | options.defaultDirectory = defaultDir; 102 | 103 | const bitrixTargetDirectory = path.resolve(options.targetDirectory, 'bitrix/templates/'); 104 | const localTargetDirectory = path.resolve(options.targetDirectory, 'local/templates/'); 105 | 106 | try { 107 | await access(templateDir, fs.constants.R_OK); 108 | } catch (err) { 109 | console.error('%s Invalid template name', chalk.red.bold('ERROR')); 110 | process.exit(1); 111 | } 112 | 113 | try { 114 | await access(defaultDir, fs.constants.R_OK); 115 | } catch (err) { 116 | console.error('%s Invalid default name', chalk.red.bold('ERROR')); 117 | process.exit(1); 118 | } 119 | 120 | const tasks = new Listr([ 121 | { 122 | title: 'Copied webpack files', 123 | task: () => copyTemplateFiles(options), 124 | }, 125 | { 126 | title: 'Copied default config files', 127 | task: () => copyDefaultFiles(options), 128 | }, 129 | { 130 | title: 'Getting bitrix templates from /bitrix', 131 | task: () => bitrixDirs = getAllDirectoriesFrom(options, 'bitrix/templates/'), 132 | }, 133 | { 134 | title: 'Getting bitrix templates from /local', 135 | task: () => localDirs = getAllDirectoriesFrom(options, 'local/templates/'), 136 | }, 137 | { 138 | title: 'Run updating templates', 139 | task: () => runUpdate(bitrixTargetDirectory, localTargetDirectory), 140 | }, 141 | { 142 | title: 'Install dependencies', 143 | task: () => projectInstall({ 144 | cwd: options.targetDirectory, 145 | }), 146 | skip: () => !options.runInstall ? 'Pass --install to automatically install dependencies' 147 | : undefined, 148 | } 149 | ]); 150 | 151 | await tasks.run(); 152 | 153 | console.log('%s Webpack project ready', chalk.green.bold('DONE')); 154 | return true; 155 | } -------------------------------------------------------------------------------- /src/snippets.js: -------------------------------------------------------------------------------- 1 | export const headerSnippet = ` 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | `; 11 | 12 | export const footerSnippet = ` 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | `; -------------------------------------------------------------------------------- /templates/css/build/config.development.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const merge = require('webpack-merge'); 3 | const path = require('path'); 4 | const autoprefixer = require('autoprefixer'); 5 | const { CleanWebpackPlugin } = require('clean-webpack-plugin'); 6 | const MiniCssExtractPlugin = require("mini-css-extract-plugin"); 7 | const { StatsWriterPlugin } = require("webpack-stats-plugin"); 8 | const baseConfig = require('./config.base.js'); 9 | 10 | const ROOT_DIR = path.resolve(__dirname, '../'); 11 | const DIST_DIR = path.resolve(ROOT_DIR, 'dist'); 12 | 13 | module.exports = merge(baseConfig, { 14 | devtool: 'eval', 15 | mode: 'development', 16 | watch: true, 17 | output: { 18 | path: DIST_DIR, 19 | publicPath: '/', 20 | filename: '[name].[chunkhash].js', // Все общие js-скрипты будут располагаться в файле scripts.hash.js 21 | }, 22 | plugins: [ 23 | // очищаем папку с bundled-файлами 24 | new CleanWebpackPlugin({ root: ROOT_DIR, verbose: true, dry: false}), 25 | new MiniCssExtractPlugin({ 26 | filename: '[name].[chunkhash].css', 27 | allChunks: true, 28 | }), 29 | 30 | // генерируем файл с названиями новых файлов с новым хэшем, чтобы потом их спарсить и подключить PHP-скриптом 31 | 32 | new StatsWriterPlugin({ 33 | filename: "stats.json" // Default 34 | }), 35 | ], 36 | module: { 37 | rules: [ 38 | { 39 | test: /\.s?css$/, 40 | use: [ 41 | MiniCssExtractPlugin.loader, // 'style-loader' not working 42 | { 43 | loader: 'css-loader', 44 | options: { 45 | sourceMap: true, 46 | } 47 | }, 48 | { 49 | loader: 'postcss-loader', 50 | options: { 51 | sourceMap: true, 52 | plugins: [ 53 | autoprefixer() 54 | ] 55 | } 56 | } 57 | ] 58 | } 59 | ] 60 | }, 61 | }); 62 | -------------------------------------------------------------------------------- /templates/css/build/config.production.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const webpack = require('webpack'); 3 | const merge = require('webpack-merge'); 4 | const baseConfig = require('./config.base.js'); 5 | const TerserPlugin = require('terser-webpack-plugin'); 6 | const BundleAnalyzer = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; 7 | const { CleanWebpackPlugin } = require('clean-webpack-plugin'); 8 | const autoprefixer = require('autoprefixer'); 9 | const MiniCssExtractPlugin = require("mini-css-extract-plugin"); 10 | const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); 11 | const { StatsWriterPlugin } = require("webpack-stats-plugin"); 12 | 13 | const ROOT_DIR = path.resolve(__dirname, '../'); 14 | const DIST_DIR = path.resolve(ROOT_DIR, 'dist'); 15 | 16 | module.exports = merge(baseConfig, { 17 | mode: 'production', 18 | devtool: 'source-map', 19 | target: 'web', 20 | output: { 21 | path: DIST_DIR, 22 | publicPath: '/', 23 | filename: '[name].[chunkhash].js', // All common js-files will set in one file: scripts.hash.js 24 | chunkFilename: '[name].[chunkhash].js', 25 | }, 26 | optimization: { 27 | minimize: true, 28 | minimizer: [ 29 | new TerserPlugin({ 30 | test: /\.js(\?.*)?$/i, 31 | parallel: true, 32 | }), 33 | new OptimizeCSSAssetsPlugin({}) 34 | ] 35 | }, 36 | plugins: [ 37 | // erasing /dist folder 38 | new CleanWebpackPlugin({ root: ROOT_DIR, verbose: true, dry: false}), 39 | 40 | new MiniCssExtractPlugin({ 41 | filename: '[name].[chunkhash].css', // marya.hash.css, ed.hash.css, mia.hash.css 42 | allChunks: false,//chunkFilename: '[id].[hash].css', 43 | }), 44 | 45 | // генерируем файл с названиями новых файлов с новым хэшем, чтобы потом их спарсить и подключить PHP-скриптом 46 | new StatsWriterPlugin({ 47 | filename: "stats.json" // Default 48 | }), 49 | 50 | ], 51 | module: { 52 | rules: [ 53 | { 54 | test: /\.s?css$/, 55 | use: [ 56 | MiniCssExtractPlugin.loader, // dev: 'style-loader' 57 | 'css-loader', 58 | { 59 | loader: 'postcss-loader', 60 | options: { 61 | plugins: [ 62 | autoprefixer() 63 | ] 64 | } 65 | } 66 | ] 67 | } 68 | ] 69 | }, 70 | }); 71 | -------------------------------------------------------------------------------- /templates/css/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bitrix-webpack-css-template", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "webpack --mode development --config build/config.development.js", 8 | "prod": "webpack --mode production --config build/config.production.js" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "esm": "3.2.25", 15 | "uikit": "^3.2.3", 16 | "vue": "^2.6.10", 17 | "vue-router": "^3.1.3" 18 | }, 19 | "devDependencies": { 20 | "@babel/core": "^7.7.4", 21 | "@babel/preset-env": "^7.7.4", 22 | "autoprefixer": "^9.7.2", 23 | "babel-loader": "^8.0.6", 24 | "clean-webpack-plugin": "^3.0.0", 25 | "css-loader": "^3.2.0", 26 | "mini-css-extract-plugin": "^0.8.0", 27 | "optimize-css-assets-webpack-plugin": "^5.0.3", 28 | "postcss-loader": "^3.0.0", 29 | "style-loader": "^1.0.0", 30 | "svg-url-loader": "^3.0.3", 31 | "terser-webpack-plugin": "^4.2.2", 32 | "url-loader": "^3.0.0", 33 | "vue-loader": "^15.7.2", 34 | "vue-style-loader": "^4.1.2", 35 | "vue-template-compiler": "^2.6.10", 36 | "vue-template-es2015-compiler": "^1.9.1", 37 | "webpack": "^4.41.2", 38 | "webpack-bundle-analyzer": "^3.6.0", 39 | "webpack-cli": "^3.3.10", 40 | "webpack-dev-server": "^3.9.0", 41 | "webpack-merge": "^4.2.2", 42 | "webpack-php-manifest": "^0.0.8", 43 | "webpack-stats-plugin": "^0.3.0" 44 | } 45 | } -------------------------------------------------------------------------------- /templates/default/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/preset-env" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /templates/default/.browserlistrc: -------------------------------------------------------------------------------- 1 | ie >= 11 2 | last 4 version -------------------------------------------------------------------------------- /templates/default/build/config.base.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const webpack = require('webpack'); 3 | const { VueLoaderPlugin } = require('vue-loader'); 4 | 5 | const ROOT_DIR = path.resolve(__dirname, '../'); 6 | 7 | module.exports = { 8 | // entry points of webpack, in vendor.js is for common styles and js 9 | // in custom.js is for unique styles and js of project 10 | entry: { 11 | vendor: path.resolve(ROOT_DIR, 'src', 'webpack_vendor.js'), 12 | custom: path.resolve(ROOT_DIR, 'src', 'webpack_custom.js'), 13 | }, 14 | // where webpack search dependencies: 15 | resolve: { 16 | modules: [ 17 | "node_modules", 18 | ], 19 | extensions: ['.js', '.css', '.scss', '.vue'], 20 | alias: { 21 | 'vue$': 'vue/dist/vue.esm.js', 22 | '@': path.resolve(ROOT_DIR, 'custom', 'vue') // import AppHome from "@/components/AppHome"; 23 | } 24 | }, 25 | module: { 26 | rules: [ 27 | // js 28 | { 29 | test: /\.js$/, 30 | use: 'babel-loader', 31 | exclude: [ 32 | path.resolve(ROOT_DIR, 'node_modules'), 33 | ], 34 | }, 35 | { 36 | test: /\.vue$/, 37 | loader: 'vue-loader', 38 | options: { 39 | loaders: { 40 | js: { 41 | loader: 'babel-loader', 42 | options: { 43 | presets: ['@babel/preset-env'], 44 | plugins: ['@babel/plugin-transform-shorthand-properties'] 45 | } 46 | } 47 | } 48 | } 49 | }, 50 | // images 51 | { 52 | test: /\.(png|jpg|gif)$/i, 53 | use: [ 54 | { 55 | loader: 'url-loader', 56 | options: { 57 | limit: 10 * 1024, // картинки до 10 КБ 58 | noquotes: true, 59 | } 60 | } 61 | ] 62 | }, 63 | { 64 | test: /\.svg$/, 65 | loader: 'svg-url-loader', 66 | options: { 67 | limit: 10 * 1024, // картинки до 10 КБ 68 | noquotes: true, 69 | } 70 | }, 71 | // fonts 72 | { test: /\.(woff|woff2|eot|ttf|otf)$/, use: ['url-loader'] }, 73 | ] 74 | }, 75 | plugins: [ 76 | new VueLoaderPlugin() 77 | ] 78 | }; 79 | -------------------------------------------------------------------------------- /templates/default/build/getWebpackAssets.php: -------------------------------------------------------------------------------- 1 | $value) { 12 | preg_match('/^\w*/', $value[0], $matches ); 13 | switch ($matches[0]) { 14 | case 'custom': 15 | foreach ($value as $f => $val) { 16 | preg_match('/\.\w*$/', $val, $matches); 17 | switch ($matches[0]) { 18 | case ".css": 19 | $GLOBALS['CUSTOM_STYLES'] = $val; 20 | break; 21 | case ".js": 22 | $GLOBALS['CUSTOM_SCRIPTS'] = $val; 23 | break; 24 | } 25 | } 26 | case 'vendor': 27 | foreach ($value as $f => $val) { 28 | preg_match('/\.\w*$/', $val, $matches); 29 | switch ($matches[0]) { 30 | case ".css": 31 | $GLOBALS['VENDOR_STYLES'] = $val; 32 | break; 33 | case ".js": 34 | $GLOBALS['VENDOR_SCRIPTS'] = $val; 35 | break; 36 | } 37 | } 38 | } 39 | } 40 | ?> 41 | -------------------------------------------------------------------------------- /templates/default/custom/css/example.css: -------------------------------------------------------------------------------- 1 | b { 2 | font-weight: bold; 3 | } -------------------------------------------------------------------------------- /templates/default/custom/img/webpack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sedovdmitry/bitrix-webpack/c702ad256db2ce5d689d117313877fd027874ee5/templates/default/custom/img/webpack.png -------------------------------------------------------------------------------- /templates/default/custom/js/hello_webpack.js: -------------------------------------------------------------------------------- 1 | console.log('hello webpack'); -------------------------------------------------------------------------------- /templates/default/custom/vue/Example.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | 18 | 21 | -------------------------------------------------------------------------------- /templates/default/custom/vue/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sedovdmitry/bitrix-webpack/c702ad256db2ce5d689d117313877fd027874ee5/templates/default/custom/vue/assets/logo.png -------------------------------------------------------------------------------- /templates/default/custom/vue/components/Hello.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | 16 | 17 | 19 | -------------------------------------------------------------------------------- /templates/default/custom/vue/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue'; 4 | 5 | /* eslint-disable no-new */ 6 | if(document.getElementById("vue-example")) { 7 | const Example = require('./Example').default; 8 | 9 | Vue.config.productionTip = false; 10 | 11 | new Vue({ 12 | el: '#vue-example', 13 | components: {Example}, 14 | template: '', 15 | }); 16 | } 17 | -------------------------------------------------------------------------------- /templates/default/src/webpack_custom.js: -------------------------------------------------------------------------------- 1 | // styles 2 | import '../custom/css/example.css'; 3 | 4 | // js 5 | import '../custom/js/hello_webpack'; 6 | 7 | // vue 8 | import '../custom/vue/main'; -------------------------------------------------------------------------------- /templates/default/src/webpack_vendor.js: -------------------------------------------------------------------------------- 1 | // vendor styles 2 | import '../node_modules/uikit/dist/css/uikit.css' 3 | 4 | // vendor js 5 | 6 | // set uikit in global variable 7 | import UIkit from 'uikit' 8 | window.UIkit = UIkit; 9 | 10 | // icons 11 | import Icons from '../node_modules/uikit/dist/js/uikit-icons'; 12 | UIkit.use(Icons); 13 | -------------------------------------------------------------------------------- /templates/sass/build/config.development.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const merge = require('webpack-merge'); 3 | const path = require('path'); 4 | const autoprefixer = require('autoprefixer'); 5 | const { CleanWebpackPlugin } = require('clean-webpack-plugin'); 6 | const MiniCssExtractPlugin = require("mini-css-extract-plugin"); 7 | const { StatsWriterPlugin } = require("webpack-stats-plugin"); 8 | const baseConfig = require('./config.base.js'); 9 | 10 | const ROOT_DIR = path.resolve(__dirname, '../'); 11 | const DIST_DIR = path.resolve(ROOT_DIR, 'dist'); 12 | 13 | module.exports = merge(baseConfig, { 14 | devtool: 'eval', 15 | mode: 'development', 16 | watch: true, 17 | output: { 18 | path: DIST_DIR, 19 | publicPath: '/', 20 | filename: '[name].[chunkhash].js', // Все общие js-скрипты будут располагаться в файле scripts.hash.js 21 | }, 22 | plugins: [ 23 | // очищаем папку с bundled-файлами 24 | new CleanWebpackPlugin({ root: ROOT_DIR, verbose: true, dry: false}), 25 | new MiniCssExtractPlugin({ 26 | filename: '[name].[chunkhash].css', 27 | allChunks: true, 28 | }), 29 | 30 | // генерируем файл с названиями новых файлов с новым хэшем, чтобы потом их спарсить и подключить PHP-скриптом 31 | 32 | new StatsWriterPlugin({ 33 | filename: "stats.json" // Default 34 | }), 35 | ], 36 | module: { 37 | rules: [ 38 | { 39 | test: /\.s?css$/, 40 | use: [ 41 | MiniCssExtractPlugin.loader, // 'style-loader' not working 42 | { 43 | loader: 'css-loader', 44 | options: { 45 | sourceMap: true, 46 | } 47 | }, 48 | { 49 | loader: 'postcss-loader', 50 | options: { 51 | sourceMap: true, 52 | plugins: [ 53 | autoprefixer() 54 | ] 55 | } 56 | }, 57 | { 58 | loader: 'sass-loader', 59 | options: { 60 | sourceMap: true, 61 | } 62 | } 63 | 64 | ] 65 | } 66 | ] 67 | }, 68 | }); 69 | -------------------------------------------------------------------------------- /templates/sass/build/config.production.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const webpack = require('webpack'); 3 | const merge = require('webpack-merge'); 4 | const baseConfig = require('./config.base.js'); 5 | const TerserPlugin = require('terser-webpack-plugin'); 6 | const BundleAnalyzer = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; 7 | const { CleanWebpackPlugin } = require('clean-webpack-plugin'); 8 | const autoprefixer = require('autoprefixer'); 9 | const MiniCssExtractPlugin = require("mini-css-extract-plugin"); 10 | const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); 11 | const { StatsWriterPlugin } = require("webpack-stats-plugin"); 12 | 13 | const ROOT_DIR = path.resolve(__dirname, '../'); 14 | const DIST_DIR = path.resolve(ROOT_DIR, 'dist'); 15 | 16 | module.exports = merge(baseConfig, { 17 | mode: 'production', 18 | devtool: '', 19 | target: 'web', 20 | output: { 21 | path: DIST_DIR, 22 | publicPath: '/', 23 | filename: '[name].[chunkhash].js', // All common js-files will set in one file: scripts.hash.js 24 | chunkFilename: '[name].[chunkhash].js', 25 | }, 26 | optimization: { 27 | minimize: true, 28 | minimizer: [ 29 | new TerserPlugin({ 30 | test: /\.js(\?.*)?$/i, 31 | parallel: true, 32 | }), 33 | new OptimizeCSSAssetsPlugin({}) 34 | ] 35 | }, 36 | plugins: [ 37 | // erasing /dist folder 38 | new CleanWebpackPlugin({ root: ROOT_DIR, verbose: true, dry: false}), 39 | 40 | new MiniCssExtractPlugin({ 41 | filename: '[name].[chunkhash].css', // marya.hash.css, ed.hash.css, mia.hash.css 42 | allChunks: false,//chunkFilename: '[id].[hash].css', 43 | }), 44 | 45 | // генерируем файл с названиями новых файлов с новым хэшем, чтобы потом их спарсить и подключить PHP-скриптом 46 | new StatsWriterPlugin({ 47 | filename: "stats.json" // Default 48 | }), 49 | 50 | ], 51 | module: { 52 | rules: [ 53 | { 54 | test: /\.s?css$/, 55 | use: [ 56 | MiniCssExtractPlugin.loader, // dev: 'style-loader' 57 | 'css-loader', 58 | { 59 | loader: 'postcss-loader', 60 | options: { 61 | plugins: [ 62 | autoprefixer() 63 | ] 64 | } 65 | }, 66 | 'sass-loader' 67 | ] 68 | } 69 | ] 70 | }, 71 | }); 72 | -------------------------------------------------------------------------------- /templates/sass/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bitrix-webpack-sass-template", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "webpack --mode development --config build/config.development.js", 8 | "prod": "webpack --mode production --config build/config.production.js" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "esm": "3.2.25", 15 | "uikit": "^3.2.3", 16 | "vue": "^2.6.10", 17 | "vue-router": "^3.1.3" 18 | }, 19 | "devDependencies": { 20 | "@babel/core": "^7.7.4", 21 | "@babel/preset-env": "^7.7.4", 22 | "autoprefixer": "^9.7.2", 23 | "babel-loader": "^8.0.6", 24 | "clean-webpack-plugin": "^3.0.0", 25 | "css-loader": "^3.2.0", 26 | "mini-css-extract-plugin": "^0.8.0", 27 | "node-sass": "^4.13.0", 28 | "optimize-css-assets-webpack-plugin": "^5.0.3", 29 | "postcss-loader": "^3.0.0", 30 | "sass-loader": "^8.0.0", 31 | "style-loader": "^1.0.0", 32 | "svg-url-loader": "^3.0.3", 33 | "terser-webpack-plugin": "^4.2.2", 34 | "url-loader": "^3.0.0", 35 | "vue-loader": "^15.7.2", 36 | "vue-style-loader": "^4.1.2", 37 | "vue-template-compiler": "^2.6.10", 38 | "vue-template-es2015-compiler": "^1.9.1", 39 | "webpack": "^4.41.2", 40 | "webpack-bundle-analyzer": "^3.6.0", 41 | "webpack-cli": "^3.3.10", 42 | "webpack-dev-server": "^3.9.0", 43 | "webpack-merge": "^4.2.2", 44 | "webpack-php-manifest": "0.0.5", 45 | "webpack-stats-plugin": "^0.3.0" 46 | } 47 | } -------------------------------------------------------------------------------- /templates/test/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bitrix-webpack-test-template", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "webpack --mode development --config build/config.development.js", 8 | "prod": "webpack --mode production --config build/config.production.js" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "esm": "3.2.25" 15 | }, 16 | "devDependencies": { 17 | } 18 | } --------------------------------------------------------------------------------