├── .eslintignore ├── templates └── app │ ├── src │ ├── styles │ │ └── main.css │ ├── app │ │ ├── shared │ │ │ └── .gitkeep │ │ ├── app.html │ │ ├── app.component.js │ │ ├── app.route.js │ │ ├── app.config.js │ │ └── app.js │ ├── public │ │ ├── img │ │ │ └── .gitkeep │ │ └── index.html │ ├── config │ │ ├── config.prod.json │ │ ├── i18n │ │ │ ├── en.json │ │ │ └── fr.json │ │ ├── config.dev.json │ │ └── README.md │ ├── styles-sass │ │ ├── main.scss │ │ ├── themes │ │ │ └── README.md │ │ ├── pages │ │ │ └── README.md │ │ ├── base │ │ │ └── README.md │ │ ├── layout │ │ │ └── README.md │ │ ├── components │ │ │ └── README.md │ │ ├── vendors │ │ │ └── README.md │ │ ├── abstracts │ │ │ └── README.md │ │ └── README.md │ ├── styles-less │ │ ├── main.less │ │ ├── themes │ │ │ └── README.md │ │ ├── pages │ │ │ └── README.md │ │ ├── base │ │ │ └── README.md │ │ ├── layout │ │ │ └── README.md │ │ ├── components │ │ │ └── README.md │ │ ├── vendors │ │ │ └── README.md │ │ ├── abstracts │ │ │ └── README.md │ │ └── README.md │ ├── _.htmlhintrc │ ├── ui-angular-material │ │ ├── styles-less │ │ │ ├── base │ │ │ │ └── _typography.less │ │ │ └── vendors │ │ │ │ └── _material-icons.less │ │ ├── styles-sass │ │ │ ├── base │ │ │ │ └── _typography.scss │ │ │ └── vendors │ │ │ │ └── _material-icons.scss │ │ └── styles │ │ │ └── main.css │ └── _.csslintrc │ ├── _.babelrc │ ├── json-server │ ├── routes.json │ └── db.json │ ├── test │ ├── .eslintrc │ ├── unit.spec.js │ └── unit │ │ └── app.spec.js │ ├── docs │ ├── guide.ngdoc │ ├── guide │ │ └── howToUse.ngdoc │ ├── _index.ngdoc │ └── api.ngdoc │ ├── _.editorconfig │ ├── filepath-loader.js │ ├── _.gitignore │ ├── postcss.config.js │ ├── _sonar-project.properties │ ├── _.sreporterrc │ ├── CHANGELOG.md │ ├── COMMITS-CONVENTION.md │ ├── README.md │ ├── tools │ └── git │ │ └── commit-msg.js │ ├── karma.conf.js │ ├── _.sass-lint.yml │ ├── _.eslintrc │ ├── _package.json │ └── webpack.config.js ├── .travis.yml ├── test ├── .eslintrc ├── app │ ├── linters.spec.js │ ├── environments.spec.js │ ├── dgeni.spec.js │ ├── json-server.spec.js │ ├── app-name.spec.js │ ├── resource.spec.js │ ├── tests.spec.js │ ├── angular-translate.spec.js │ ├── css-preprocessors.spec.js │ ├── sonar.spec.js │ └── ui-frameworks.spec.js └── app.js ├── .npmignore ├── assets ├── css3.png ├── less.png ├── npm.png ├── sass.png ├── yarn.png ├── dgeni.png ├── eslint.png ├── karma.png ├── webpack.png ├── angularjs.png ├── bootstrap.png ├── ui-router.png ├── foundation.png ├── json-server.png ├── sonar-qube.png ├── angular-translate.png └── angularjs-material.png ├── .gitignore ├── .editorconfig ├── package.json ├── LICENSE ├── CHANGELOG.md ├── docs └── STACK.md ├── README.md ├── .eslintrc ├── generators └── app │ ├── prompt.js │ ├── index.js │ └── write.js └── yarn.lock /.eslintignore: -------------------------------------------------------------------------------- 1 | templates 2 | -------------------------------------------------------------------------------- /templates/app/src/styles/main.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/app/src/app/shared/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/app/src/public/img/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "6" 4 | -------------------------------------------------------------------------------- /templates/app/_.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["es2015"] 3 | } 4 | -------------------------------------------------------------------------------- /templates/app/json-server/routes.json: -------------------------------------------------------------------------------- 1 | { 2 | "/api/": "/" 3 | } 4 | -------------------------------------------------------------------------------- /test/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "mocha": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | !._* 2 | 3 | test/ 4 | docs/ 5 | assets/ 6 | 7 | yarn.lock 8 | -------------------------------------------------------------------------------- /templates/app/test/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "mocha": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /templates/app/src/config/config.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "REST_URL": "PUT_YOUR_REST_URL_HERE" 3 | } 4 | -------------------------------------------------------------------------------- /assets/css3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/css3.png -------------------------------------------------------------------------------- /assets/less.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/less.png -------------------------------------------------------------------------------- /assets/npm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/npm.png -------------------------------------------------------------------------------- /assets/sass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/sass.png -------------------------------------------------------------------------------- /assets/yarn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/yarn.png -------------------------------------------------------------------------------- /templates/app/src/config/i18n/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "app.title": "generator-webpack-angular.EN" 3 | } 4 | -------------------------------------------------------------------------------- /templates/app/src/config/i18n/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "app.title": "generator-webpack-angular.FR" 3 | } 4 | -------------------------------------------------------------------------------- /assets/dgeni.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/dgeni.png -------------------------------------------------------------------------------- /assets/eslint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/eslint.png -------------------------------------------------------------------------------- /assets/karma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/karma.png -------------------------------------------------------------------------------- /assets/webpack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/webpack.png -------------------------------------------------------------------------------- /assets/angularjs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/angularjs.png -------------------------------------------------------------------------------- /assets/bootstrap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/bootstrap.png -------------------------------------------------------------------------------- /assets/ui-router.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/ui-router.png -------------------------------------------------------------------------------- /assets/foundation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/foundation.png -------------------------------------------------------------------------------- /assets/json-server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/json-server.png -------------------------------------------------------------------------------- /assets/sonar-qube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/sonar-qube.png -------------------------------------------------------------------------------- /templates/app/src/app/app.html: -------------------------------------------------------------------------------- 1 | <% if (angularTranslate) { -%>{{ 'app.title' | translate }}<% } else { -%>My App<% } -%> 2 | -------------------------------------------------------------------------------- /assets/angular-translate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/angular-translate.png -------------------------------------------------------------------------------- /assets/angularjs-material.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/groupe-sii/generator-webpack-angular/HEAD/assets/angularjs-material.png -------------------------------------------------------------------------------- /templates/app/src/app/app.component.js: -------------------------------------------------------------------------------- 1 | import template from './app.html'; 2 | 3 | export default { 4 | template: template 5 | }; 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Dependency directories 7 | node_modules 8 | 9 | # WebStorm 10 | .idea/ 11 | -------------------------------------------------------------------------------- /templates/app/docs/guide.ngdoc: -------------------------------------------------------------------------------- 1 | @ngdoc overview 2 | 3 | @name Guide 4 | 5 | @description 6 | 7 | # Guide 8 | 9 | A sélectionner à gauche. 10 | -------------------------------------------------------------------------------- /templates/app/src/config/config.dev.json: -------------------------------------------------------------------------------- 1 | { 2 | "REST_URL": "<% if (jsonServer) { -%>http://localhost:3000/<% }else{ -%>PUT_YOUR_REST_URL_HERE<% } -%>" 3 | } 4 | -------------------------------------------------------------------------------- /templates/app/src/styles-sass/main.scss: -------------------------------------------------------------------------------- 1 | <% if (uiFramework === 'ngMaterial') { -%> 2 | // Vendors 3 | @import 'vendors/material-icons'; 4 | 5 | // Base 6 | @import 'base/typography'; 7 | <% } -%> 8 | -------------------------------------------------------------------------------- /templates/app/docs/guide/howToUse.ngdoc: -------------------------------------------------------------------------------- 1 | @ngdoc overview 2 | 3 | @name howToUse 4 | 5 | @description 6 | 7 | # How To Use this module 8 | 9 | 1. aaaaaa 10 | 11 | 1. bbbbbb 12 | 13 | -------------------------------------------------------------------------------- /templates/app/src/styles-less/main.less: -------------------------------------------------------------------------------- 1 | <% if (uiFramework === 'ngMaterial') { -%> 2 | // Vendors 3 | @import 'vendors/material-icons'; 4 | 5 | // Base 6 | @import 'base/typography'; 7 | <% } -%> 8 | -------------------------------------------------------------------------------- /templates/app/test/unit.spec.js: -------------------------------------------------------------------------------- 1 | import 'angular'; 2 | import 'angular-mocks'; 3 | 4 | let testsContext = require.context('./unit', true, /\.spec\.js$/); 5 | testsContext.keys().forEach(testsContext); 6 | -------------------------------------------------------------------------------- /templates/app/json-server/db.json: -------------------------------------------------------------------------------- 1 | { 2 | "posts": [ 3 | { "id": 1, "title": "json-server", "author": "typicode" } 4 | ], 5 | "comments": [ 6 | { "id": 1, "body": "some comment", "postId": 1 } 7 | ], 8 | "profile": { "name": "typicode" } 9 | } 10 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /templates/app/_.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /templates/app/docs/_index.ngdoc: -------------------------------------------------------------------------------- 1 | @ngdoc overview 2 | 3 | @name Docs Top 4 | 5 | @description 6 | 7 | ## Documentation du projet <%= appName %> 8 | 9 | Page d'accueil de la documentation. 10 | 11 | La documentation du code est disponible ici. 12 | 13 | Le guide d'utilisation est disponible ici. 14 | -------------------------------------------------------------------------------- /templates/app/filepath-loader.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This Webpack loader adds file path in unit test files. 3 | */ 4 | module.exports = function (content) { 5 | let path = this.resourcePath.replace(/\\/g, '\\\\'); 6 | return content.replace(/^(describe\(([^{])+{)/m, '$1beforeEach(function() {window.__setCurrentFile(\'' + path + '\')});\n'); 7 | }; 8 | -------------------------------------------------------------------------------- /templates/app/src/app/app.route.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Application route definition. 3 | */ 4 | export default function ($stateProvider, $urlRouterProvider) { 5 | 'ngInject'; 6 | 7 | $stateProvider 8 | .state('app', { 9 | url : '/', 10 | component: 'app' 11 | }); 12 | 13 | $urlRouterProvider.otherwise('/'); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /templates/app/_.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Dependency directories 7 | node_modules 8 | 9 | # Optional npm cache directory 10 | .npm 11 | 12 | # Build folder 13 | dist/ 14 | 15 | # Reporters 16 | reports/ 17 | 18 | # IDE files 19 | .idea 20 | *.iml 21 | out 22 | gen 23 | .vscode 24 | 25 | # logs folder 26 | dist-docs/ 27 | -------------------------------------------------------------------------------- /templates/app/src/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <%= appName %> 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /templates/app/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | // Reference: https://github.com/sebastian-software/postcss-smart-import 4 | // require('postcss-smart-import')(), 5 | 6 | // Reference: https://github.com/jonathantneal/precss 7 | // require('precss')(), 8 | 9 | // Reference: https://github.com/postcss/autoprefixer 10 | require('autoprefixer')() 11 | ] 12 | }; 13 | -------------------------------------------------------------------------------- /templates/app/docs/api.ngdoc: -------------------------------------------------------------------------------- 1 | @ngdoc overview 2 | 3 | @name API Top 4 | 5 | @description 6 | 7 | # API 8 | 9 | L'architecture du projet est située ci-dessous : 10 | 11 | ### Légende 12 | 13 | [![Légende](./images/png/legend.png)](./images/png/legend.png) 14 | 15 | ### Tout confondu 16 | 17 | [![All](./images/png/all.png)](./images/png/all.png) 18 | 19 | ### Les modules 20 | 21 | [![Modules](./images/png/modules.png)](./images/png/modules.png) 22 | -------------------------------------------------------------------------------- /templates/app/src/_.htmlhintrc: -------------------------------------------------------------------------------- 1 | { 2 | "attr-lowercase": true, 3 | "attr-value-double-quotes": true, 4 | "doctype-first": false, 5 | "doctype-html5": true, 6 | "force": true, 7 | "id-unique": true, 8 | "alt-require": true, 9 | "spec-char-escape": true, 10 | "src-not-empty": true, 11 | "style-disabled": false, 12 | "tagname-lowercase": true, 13 | "tag-pair": true, 14 | "inline-style-disabled": true, 15 | "space-tab-mixed-disabled": "space", 16 | "tag-self-close": true, 17 | "title-require": true, 18 | "id-class-value": "dash", 19 | "attr-unsafe-chars": true 20 | } 21 | -------------------------------------------------------------------------------- /templates/app/src/styles-sass/themes/README.md: -------------------------------------------------------------------------------- 1 | # Themes 2 | 3 | This `themes/` folder contains themes files. 4 | 5 | * `_theme.scss` 6 | * `_admin.scss` 7 | 8 | This folder is very project-specific and is likely to be non-existent on many projects. 9 | 10 | ## Structure 11 | 12 | ``` 13 | styles/ 14 | | 15 | |– themes/ 16 | | |– _theme.scss # Default theme 17 | | |– _admin.scss # Admin theme 18 | | … # Etc. 19 | ``` 20 | 21 | ## Source 22 | 23 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 24 | -------------------------------------------------------------------------------- /templates/app/src/styles-less/themes/README.md: -------------------------------------------------------------------------------- 1 | # Themes 2 | 3 | This `themes/` folder contains themes files. 4 | 5 | * `_theme.less` 6 | * `_admin.less` 7 | 8 | This folder is very project-specific and is likely to be non-existent on many projects. 9 | 10 | ## Structure 11 | 12 | ``` 13 | styles/ 14 | | 15 | |– themes/ 16 | | |– _theme.less # Default theme 17 | | |– _admin.less # Admin theme 18 | | … # Etc. 19 | ``` 20 | 21 | ## Source 22 | 23 | Source (SASS guidelines applied to LESS): 24 | 25 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 26 | -------------------------------------------------------------------------------- /test/app/linters.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const helpers = require('yeoman-test'); 5 | const assert = require('yeoman-assert'); 6 | 7 | module.exports = () => { 8 | 9 | describe('linters', () => { 10 | 11 | before(done => { 12 | this.generator = helpers 13 | .run(path.join(__dirname, '../../generators/app')) 14 | .toPromise() 15 | .then(() => done()); 16 | }); 17 | 18 | it('should add HTMLHint rules', () => { 19 | assert.file('src/.htmlhintrc'); 20 | }); 21 | 22 | it('should add ESLint rules', () => { 23 | assert.file('.eslintrc'); 24 | }); 25 | 26 | }); 27 | 28 | }; 29 | -------------------------------------------------------------------------------- /templates/app/_sonar-project.properties: -------------------------------------------------------------------------------- 1 | sonar.projectKey=<%= _.slugify(appName) %> 2 | sonar.projectName=<%= appName %> 3 | sonar.projectVersion=0.0.0 4 | 5 | sonar.sources=src/app,src/public,src/styles 6 | sonar.sourceEncoding=UTF-8 7 | 8 | sonar.exclusions=node_modules/**/*,reports/**/* 9 | sonar.tests=test 10 | 11 | sonar.sii.quality.html.report.path=reports/sonar/htmlhint.json 12 | <% if (cssPreprocessor === 'css') { -%> 13 | sonar.sii.quality.css.report.path=reports/sonar/csslint.json 14 | <% } -%> 15 | <% if (cssPreprocessor === 'sass') { -%> 16 | sonar.sii.quality.scss.report.path=reports/sonar/scsslint.json 17 | <% } -%> 18 | sonar.sii.quality.js.eslint.report.path=reports/sonar/eslint.json 19 | sonar.sii.quality.angular.eslint.report.path=reports/sonar/eslint-angular.json 20 | -------------------------------------------------------------------------------- /test/app/environments.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const helpers = require('yeoman-test'); 5 | const assert = require('yeoman-assert'); 6 | 7 | module.exports = () => { 8 | 9 | describe('environments settings', () => { 10 | 11 | before(done => { 12 | this.generator = helpers 13 | .run(path.join(__dirname, '../../generators/app')) 14 | .toPromise() 15 | .then(() => done()); 16 | }); 17 | 18 | it('should generate a README', () => { 19 | assert.file('src/config/README.md'); 20 | }); 21 | 22 | it('should generate default config files', () => { 23 | assert.file('src/config/config.dev.json'); 24 | assert.file('src/config/config.prod.json'); 25 | }); 26 | 27 | }); 28 | 29 | }; 30 | -------------------------------------------------------------------------------- /templates/app/src/ui-angular-material/styles-less/base/_typography.less: -------------------------------------------------------------------------------- 1 | //---------------------------------------- 2 | // Typography 3 | //---------------------------------------- 4 | 5 | // Material Design Icons 6 | //---------------------------------------- 7 | 8 | @font-face { 9 | font-family: 'Material Icons'; 10 | font-style: normal; 11 | font-weight: 400; 12 | src: url('~material-design-icons/iconfont/MaterialIcons-Regular.eot'); // For IE6-8 13 | src: local('Material Icons'), 14 | local('MaterialIcons-Regular'), 15 | url('~material-design-icons/iconfont/MaterialIcons-Regular.woff2') format('woff2'), 16 | url('~material-design-icons/iconfont/MaterialIcons-Regular.woff') format('woff'), 17 | url('~material-design-icons/iconfont/MaterialIcons-Regular.ttf') format('truetype'); 18 | } 19 | -------------------------------------------------------------------------------- /templates/app/src/ui-angular-material/styles-less/vendors/_material-icons.less: -------------------------------------------------------------------------------- 1 | //---------------------------------------- 2 | // Material Design Icons 3 | //---------------------------------------- 4 | 5 | .material-icons { 6 | direction: ltr; 7 | display: inline-block; 8 | font-family: 'Material Icons'; 9 | font-feature-settings: 'liga'; // Support for IE 10 | font-size: 24px; // Preferred icon size 11 | -moz-osx-font-smoothing: grayscale; // Support for Firefox 12 | -webkit-font-smoothing: antialiased; // Support for all WebKit browsers 13 | font-style: normal; 14 | font-weight: normal; 15 | letter-spacing: normal; 16 | line-height: 1; 17 | text-rendering: optimizeLegibility; // Support for Safari and Chrome 18 | text-transform: none; 19 | white-space: nowrap; 20 | word-wrap: normal; 21 | } 22 | -------------------------------------------------------------------------------- /templates/app/src/ui-angular-material/styles-sass/base/_typography.scss: -------------------------------------------------------------------------------- 1 | //---------------------------------------- 2 | // Typography 3 | //---------------------------------------- 4 | 5 | // Material Design Icons 6 | //---------------------------------------- 7 | 8 | @font-face { 9 | // sass-lint:disable no-duplicate-properties 10 | font-family: 'Material Icons'; 11 | font-style: normal; 12 | font-weight: 400; 13 | src: url('~material-design-icons/iconfont/MaterialIcons-Regular.eot'); // For IE6-8 14 | src: local('Material Icons'), 15 | local('MaterialIcons-Regular'), 16 | url('~material-design-icons/iconfont/MaterialIcons-Regular.woff2') format('woff2'), 17 | url('~material-design-icons/iconfont/MaterialIcons-Regular.woff') format('woff'), 18 | url('~material-design-icons/iconfont/MaterialIcons-Regular.ttf') format('truetype'); 19 | } 20 | -------------------------------------------------------------------------------- /templates/app/src/ui-angular-material/styles-sass/vendors/_material-icons.scss: -------------------------------------------------------------------------------- 1 | //---------------------------------------- 2 | // Material Design Icons 3 | //---------------------------------------- 4 | 5 | .material-icons { 6 | // sass-lint:disable no-vendor-prefixes 7 | direction: ltr; 8 | display: inline-block; 9 | font-family: 'Material Icons'; 10 | font-feature-settings: 'liga'; // Support for IE 11 | font-size: 24px; // Preferred icon size 12 | -moz-osx-font-smoothing: grayscale; // Support for Firefox 13 | -webkit-font-smoothing: antialiased; // Support for all WebKit browsers 14 | font-style: normal; 15 | font-weight: normal; 16 | letter-spacing: normal; 17 | line-height: 1; 18 | text-rendering: optimizeLegibility; // Support for Safari and Chrome 19 | text-transform: none; 20 | white-space: nowrap; 21 | word-wrap: normal; 22 | } 23 | -------------------------------------------------------------------------------- /templates/app/src/styles-sass/pages/README.md: -------------------------------------------------------------------------------- 1 | # Pages 2 | 3 | If you have page-specific styles, it is better to put them in a `pages/` folder, in a file named after the page. For instance, it’s not uncommon to have very specific styles for the home page hence the need for a `_home.scss` file in `pages/`. 4 | 5 | * `_home.scss` 6 | * `_contact.scss` 7 | 8 | Depending on your deployment process, these files could be called on their own to avoid merging them with the others in the resulting stylesheet. It is really up to you. 9 | 10 | ## Structure 11 | 12 | ``` 13 | styles/ 14 | | 15 | |– pages/ 16 | | |– _home.scss # Home specific styles 17 | | |– _contact.scss # Contact specific styles 18 | | … # Etc. 19 | ``` 20 | 21 | ## Source 22 | 23 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 24 | -------------------------------------------------------------------------------- /templates/app/_.sreporterrc: -------------------------------------------------------------------------------- 1 | { 2 | "projectName": "<%= appName %>", 3 | "eslint": { 4 | "src": "src/**/*.js", 5 | "report": "reports/sonar/eslint.json", 6 | "rulesFile": ".eslintrc" 7 | }, 8 | "eslintangular": { 9 | "src": "src/**/*.js", 10 | "report": "reports/sonar/eslint-angular.json", 11 | "rulesFile": ".eslintrc" 12 | }, 13 | "htmlhint": { 14 | "src": "src/**/*.html", 15 | "report": "reports/sonar/htmlhint.json", 16 | "rulesFile": "src/.htmlhintrc" 17 | }, 18 | <% if (cssPreprocessor === 'css') { -%> 19 | "csslint": { 20 | "src": "src/**/*.css", 21 | "report": "reports/sonar/csslint.json", 22 | "rulesFile": "src/.csslintrc" 23 | } 24 | <% } -%> 25 | <% if (cssPreprocessor === 'sass') { -%> 26 | "sass-to-scsslint": { 27 | "src": "src/**/*.s+(a|c)ss", 28 | "report": "reports/sonar/sass-to-scsslint.json", 29 | "rulesFile": ".sass-lint.yml" 30 | } 31 | <% } -%> 32 | } 33 | -------------------------------------------------------------------------------- /templates/app/src/_.csslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "errors": [ 3 | "duplicate-properties", 4 | "empty-rules", 5 | "known-properties", 6 | "text-indent", 7 | "vendor-prefix", 8 | "star-property-hack", 9 | "underscore-property-hack", 10 | "bulletproof-font-face", 11 | "import", 12 | "regex-selectors", 13 | "universal-selector", 14 | "shorthand", 15 | "duplicate-background-images", 16 | "ids" 17 | ], 18 | "warnings": [ 19 | "display-property-grouping", 20 | "font-faces", 21 | "zero-units", 22 | "overqualified-elements", 23 | "floats" 24 | ], 25 | "ignore": [ 26 | "box-model", 27 | "adjoining-classes", 28 | "box-sizing", 29 | "compatible-vendor-prefixes", 30 | "gradients", 31 | "fallback-colors", 32 | "unqualified-attributes", 33 | "font-sizes", 34 | "important", 35 | "outline-none", 36 | "qualified-headings", 37 | "unique-headings" 38 | ] 39 | } 40 | -------------------------------------------------------------------------------- /templates/app/src/styles-less/pages/README.md: -------------------------------------------------------------------------------- 1 | # Pages 2 | 3 | If you have page-specific styles, it is better to put them in this `pages/` folder, in a file named after the page. For instance, it’s not uncommon to have very specific styles for the home page hence the need for a `_home.less` file in `pages/`. 4 | 5 | * `_home.less` 6 | * `_contact.less` 7 | 8 | Depending on your deployment process, these files could be called on their own to avoid merging them with the others in the resulting stylesheet. It is really up to you. 9 | 10 | ## Structure 11 | 12 | ``` 13 | styles/ 14 | | 15 | |– pages/ 16 | | |– _home.less # Home specific styles 17 | | |– _contact.less # Contact specific styles 18 | | … # Etc. 19 | ``` 20 | 21 | ## Source 22 | 23 | Source (SASS guidelines applied to LESS): 24 | 25 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 26 | -------------------------------------------------------------------------------- /templates/app/src/styles-sass/base/README.md: -------------------------------------------------------------------------------- 1 | # Base 2 | 3 | The `base/` folder holds what we might call the boilerplate code for the project. In there, you might find the reset file, some typographic rules, and probably a stylesheet defining some standard styles for commonly used HTML elements (that I like to call `_base.scss`). 4 | 5 | * `_base.scss` 6 | * `_reset.scss` 7 | * `_typography.scss` 8 | 9 | If your project uses a lot of CSS animations, you might consider adding an `\_animations.scss` file in there containing the @keyframes definitions of all your animations. If you only use a them sporadically, let them live along the selectors that use them. 10 | 11 | ## Structure 12 | 13 | ``` 14 | styles/ 15 | | 16 | |– base/ 17 | | |– _reset.scss # Reset/normalize 18 | | |– _typography.scss # Typography rules 19 | | … # Etc. 20 | ``` 21 | 22 | ## Source 23 | 24 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 25 | -------------------------------------------------------------------------------- /templates/app/src/app/app.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Application configuration. 3 | */ 4 | export default function (ENVIRONNEMENT, $compileProvider, $locationProvider<% if (angularTranslate) { -%>, $translateProvider<% } -%>) { 5 | 'ngInject'; 6 | 7 | // Reference: https://docs.angularjs.org/api/ng/provider/$locationProvider#html5Mode 8 | $locationProvider.html5Mode(true); 9 | 10 | // Reference : http://blog.thoughtram.io/angularjs/2014/12/22/exploring-angular-1.3-disabling-debug-info.html 11 | $compileProvider.debugInfoEnabled(ENVIRONNEMENT !== 'prod' && ENVIRONNEMENT !== 'production'); 12 | 13 | <% if (angularTranslate) { -%> 14 | // Reference: https://angular-translate.github.io/docs/#/guide/12_asynchronous-loading#asynchronous-loading_using-staticfilesloader 15 | $translateProvider 16 | .useStaticFilesLoader({ 17 | prefix: '', 18 | suffix: '.json' 19 | }) 20 | .useSanitizeValueStrategy('sanitize') 21 | .preferredLanguage(navigator.browserLanguage || navigator.language); 22 | <% } -%> 23 | 24 | } 25 | -------------------------------------------------------------------------------- /templates/app/src/styles-sass/layout/README.md: -------------------------------------------------------------------------------- 1 | # Layout 2 | 3 | The `layout/` folder contains everything that takes part in laying out the site or application. This folder could have stylesheets for the main parts of the site (header, footer, navigation, sidebar...), the grid system or even CSS styles for all the forms. 4 | 5 | * `_grid.scss` 6 | * `_header.scss` 7 | * `_footer.scss` 8 | * `_sidebar.scss` 9 | * `_forms.scss` 10 | * `_navigation.scss` 11 | 12 | The `layout/` folder might also be called `partials/`, depending on what you prefer. 13 | 14 | ## Structure 15 | 16 | ``` 17 | styles/ 18 | | 19 | |– layout/ 20 | | |– _navigation.scss # Navigation 21 | | |– _grid.scss # Grid system 22 | | |– _header.scss # Header 23 | | |– _footer.scss # Footer 24 | | |– _sidebar.scss # Sidebar 25 | | |– _forms.scss # Forms 26 | | … # Etc. 27 | ``` 28 | 29 | ## Source 30 | 31 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 32 | -------------------------------------------------------------------------------- /test/app/dgeni.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const helpers = require('yeoman-test'); 5 | const assert = require('yeoman-assert'); 6 | 7 | module.exports = () => { 8 | 9 | describe('when using docs', () => { 10 | 11 | before(done => { 12 | this.generator = helpers 13 | .run(path.join(__dirname, '../../generators/app')) 14 | .withPrompts({ 15 | appName: 'Webpack Generator' 16 | }) 17 | .toPromise() 18 | .then(() => done()); 19 | }); 20 | 21 | it('should add webpack-angular-dgeni-plugin to the package.json', () => { 22 | assert.fileContent('package.json', /"webpack-angular-dgeni-plugin"/); 23 | }); 24 | 25 | it('should have default ngdocs files', () => { 26 | assert.file('docs/api.ngdoc'); 27 | assert.file('docs/guide.ngdoc'); 28 | assert.file('docs/guide/howToUse.ngdoc'); 29 | assert.noFile('docs/_index.ngdoc'); 30 | assert.fileContent('docs/index.ngdoc', /Webpack Generator/); 31 | }); 32 | 33 | }); 34 | 35 | }; 36 | -------------------------------------------------------------------------------- /templates/app/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). 6 | 7 | ## [Unreleased] 8 | 9 | ### Added 10 | 11 | - **i18n**: zh-CN and zh-TW translations from [@tianshuo]. 12 | - **i18n**: de translation from [@mpbzh]. 13 | - **i18n**: it-IT translation from [@roalz]. 14 | - **i18n**: sv translation from [@magol]. 15 | - **i18n**: tr-TR translation from [@karalamalar]. 16 | 17 | ### Fixed 18 | 19 | - **scope**: correct fr-FR translation typos from [Closes #1234] [@roalz]. 20 | 21 | ## [0.0.1] - 2015-12-03 22 | 23 | ### Added 24 | 25 | - **scope**: RU translation from [@aishek]. 26 | - **scope**: pt-BR translation from [@tallesl]. 27 | - **scope**: es-ES translation from [@ZeliosAriex]. 28 | 29 | [Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.3.0...HEAD 30 | [0.0.1]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.2.0...v0.3.0 31 | -------------------------------------------------------------------------------- /templates/app/src/styles-sass/components/README.md: -------------------------------------------------------------------------------- 1 | # Components 2 | 3 | For smaller components, there is the `components/` folder. While `layout/` is macro (defining the global wireframe), `components/` is more focused on widgets. It contains all kind of specific modules like a slider, a loader, a widget, and basically anything along those lines. There are usually a lot of files in `components/` since the whole site/application should be mostly composed of tiny modules. 4 | 5 | * `_media.scss` 6 | * `_carousel.scss` 7 | * `_thumbnails.scss` 8 | 9 | The `components/` folder might also be called modules/, depending on what you prefer. 10 | 11 | ## Structure 12 | 13 | ``` 14 | styles/ 15 | | 16 | |– components/ 17 | | |– _buttons.scss # Buttons 18 | | |– _carousel.scss # Carousel 19 | | |– _cover.scss # Cover 20 | | |– _dropdown.scss # Dropdown 21 | | … # Etc. 22 | ``` 23 | 24 | ## Source 25 | 26 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 27 | -------------------------------------------------------------------------------- /templates/app/src/styles-less/base/README.md: -------------------------------------------------------------------------------- 1 | # Base 2 | 3 | The `base/` folder holds what we might call the boilerplate code for the project. In there, you might find the reset file, some typographic rules, and probably a stylesheet defining some standard styles for commonly used HTML elements (that I like to call `_base.less`). 4 | 5 | * `_base.less` 6 | * `_reset.less` 7 | * `_typography.less` 8 | 9 | If your project uses a lot of CSS animations, you might consider adding an `_animations.less` file in there containing the `@keyframes` definitions of all your animations. If you only use them sporadically, let them live along the selectors that use them. 10 | 11 | ## Structure 12 | 13 | ``` 14 | styles/ 15 | | 16 | |– base/ 17 | | |– _reset.less # Reset/normalize 18 | | |– _typography.less # Typography rules 19 | | … # Etc. 20 | ``` 21 | 22 | ## Source 23 | 24 | Source (SASS guidelines applied to LESS): 25 | 26 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 27 | -------------------------------------------------------------------------------- /templates/app/src/styles-less/layout/README.md: -------------------------------------------------------------------------------- 1 | # Layout 2 | 3 | The `layout/` folder contains everything that takes part in laying out the site or application. This folder could have stylesheets for the main parts of the site (header, footer, navigation, sidebar...), the grid system or even CSS styles for all the forms. 4 | 5 | * `_grid.less` 6 | * `_header.less` 7 | * `_footer.less` 8 | * `_sidebar.less` 9 | * `_forms.less` 10 | * `_navigation.less` 11 | 12 | The `layout/` folder might also be called `partials/`, depending on what you prefer. 13 | 14 | ## Structure 15 | 16 | ``` 17 | styles/ 18 | | 19 | |– layout/ 20 | | |– _navigation.less # Navigation 21 | | |– _grid.less # Grid system 22 | | |– _header.less # Header 23 | | |– _footer.less # Footer 24 | | |– _sidebar.less # Sidebar 25 | | |– _forms.less # Forms 26 | | … # Etc. 27 | ``` 28 | 29 | ## Source 30 | 31 | Source (SASS guidelines applied to LESS): 32 | 33 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 34 | -------------------------------------------------------------------------------- /templates/app/src/styles-sass/vendors/README.md: -------------------------------------------------------------------------------- 1 | # Vendors 2 | 3 | The `vendors/` folder contains all the CSS files from external libraries and frameworks – Normalize, Bootstrap, jQueryUI, FancyCarouselSliderjQueryPowered, and so on. 4 | 5 | * `_normalize.scss` 6 | * `_bootstrap.scss` 7 | * `_jquery-ui.scss` 8 | * `_select2.scss` 9 | 10 | If you have to override a section of any vendor, you should have another folder called `vendors-extensions/` in which you may have files named exactly after the vendors they overwrite. 11 | 12 | For instance, `vendors-extensions/_bootstrap.scss` is a file containing all CSS rules intended to re-declare some of Bootstrap’s default CSS. This is to avoid editing the vendor files themselves, which is generally not a good idea. 13 | 14 | ## Structure 15 | 16 | ``` 17 | styles/ 18 | | 19 | |– vendors/ 20 | | |– _bootstrap.scss # Bootstrap 21 | | |– _jquery-ui.scss # jQuery UI 22 | | … # Etc. 23 | ``` 24 | 25 | ## Source 26 | 27 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 28 | -------------------------------------------------------------------------------- /templates/app/src/styles-less/components/README.md: -------------------------------------------------------------------------------- 1 | # Components 2 | 3 | For smaller components, there is the `components/` folder. While `layout/` is macro (defining the global wireframe), `components/` is more focused on widgets. It contains all kind of specific modules like a slider, a loader, a widget, and basically anything along those lines. There are usually a lot of files in `components/` since the whole site/application should be mostly composed of tiny modules. 4 | 5 | * `_media.less` 6 | * `_carousel.less` 7 | * `_thumbnails.less` 8 | 9 | The `components/` folder might also be called `modules/`, depending on what you prefer. 10 | 11 | ## Structure 12 | 13 | ``` 14 | styles/ 15 | | 16 | |– components/ 17 | | |– _buttons.less # Buttons 18 | | |– _carousel.less # Carousel 19 | | |– _cover.less # Cover 20 | | |– _dropdown.less # Dropdown 21 | | … # Etc. 22 | ``` 23 | 24 | ## Source 25 | 26 | Source (SASS guidelines applied to LESS): 27 | 28 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 29 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "generator-webpack-angular", 3 | "version": "0.0.4", 4 | "description": "Yeoman generator for creating AngularJS apps with Webpack", 5 | "keywords": [ 6 | "yeoman-generator", 7 | "angular", 8 | "webpack" 9 | ], 10 | "license": "MIT", 11 | "author": "SII", 12 | "contributors": [ 13 | "Jérémie Ledentu ", 14 | "Valentin Got ", 15 | "Olivier Le Lay " 16 | ], 17 | "main": "generators/app/index.js", 18 | "repository": { 19 | "type": "git", 20 | "url": "https://github.com/groupe-sii/generator-webpack-angular.git" 21 | }, 22 | "scripts": { 23 | "test": "npm run lint && mocha", 24 | "lint": "eslint ." 25 | }, 26 | "dependencies": { 27 | "chalk": "^1.1.3", 28 | "underscore.string": "^3.3.4", 29 | "yeoman-generator": "^0.24.1", 30 | "yosay": "^1.2.0" 31 | }, 32 | "devDependencies": { 33 | "eslint": "~3.7.1", 34 | "mocha": "^3.1.0", 35 | "yeoman-assert": "^2.2.1", 36 | "yeoman-test": "^1.5.1" 37 | }, 38 | "engines": { 39 | "node": ">=4.6.0" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Groupe SII 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /test/app/json-server.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const helpers = require('yeoman-test'); 5 | const assert = require('yeoman-assert'); 6 | 7 | module.exports = () => { 8 | 9 | describe('when using json-server', () => { 10 | 11 | before(done => { 12 | this.generator = helpers 13 | .run(path.join(__dirname, '../../generators/app')) 14 | .withPrompts({ 15 | otherModules: 'json-server' 16 | }) 17 | .toPromise() 18 | .then(() => done()); 19 | }); 20 | 21 | it('should add json-server to the package.json', () => { 22 | assert.fileContent('package.json', /"json-server"/); 23 | assert.fileContent('package.json', /"npm-run-all --parallel serve json-server"/); 24 | }); 25 | 26 | it('should add localhost configuration in dev config file', () => { 27 | assert.fileContent('src/config/config.dev.json', /"http:\/\/localhost:3000\/"/); 28 | }); 29 | 30 | it('should generate default server files', () => { 31 | assert.file('json-server/db.json'); 32 | assert.file('json-server/routes.json'); 33 | }); 34 | 35 | }); 36 | 37 | }; 38 | -------------------------------------------------------------------------------- /templates/app/src/styles-less/vendors/README.md: -------------------------------------------------------------------------------- 1 | # Vendors 2 | 3 | The `vendors/` folder contains all the CSS files from external libraries and frameworks – Normalize, Bootstrap, jQueryUI, FancyCarouselSliderjQueryPowered, and so on. 4 | 5 | * `_normalize.less` 6 | * `_bootstrap.less` 7 | * `_jquery-ui.less` 8 | * `_select2.less` 9 | 10 | If you have to override a section of any vendor, you should have another folder called `vendors-extensions/` in which you may have files named exactly after the vendors they overwrite. 11 | 12 | For instance, `vendors-extensions/_bootstrap.less` is a file containing all CSS rules intended to re-declare some of Bootstrap’s default CSS. This is to avoid editing the vendor files themselves, which is generally not a good idea. 13 | 14 | ## Structure 15 | 16 | ``` 17 | styles/ 18 | | 19 | |– vendors/ 20 | | |– _bootstrap.less # Bootstrap 21 | | |– _jquery-ui.less # jQuery UI 22 | | … # Etc. 23 | ``` 24 | 25 | ## Source 26 | 27 | Source (SASS guidelines applied to LESS): 28 | 29 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 30 | -------------------------------------------------------------------------------- /templates/app/src/ui-angular-material/styles/main.css: -------------------------------------------------------------------------------- 1 | /* Material Icons */ 2 | 3 | @font-face { 4 | font-family: 'Material Icons'; 5 | font-style: normal; 6 | font-weight: 400; 7 | src: url('~material-design-icons/iconfont/MaterialIcons-Regular.eot'); /* For IE6-8 */ 8 | src: local('Material Icons'), 9 | local('MaterialIcons-Regular'), 10 | url('~material-design-icons/iconfont/MaterialIcons-Regular.woff2') format('woff2'), 11 | url('~material-design-icons/iconfont/MaterialIcons-Regular.woff') format('woff'), 12 | url('~material-design-icons/iconfont/MaterialIcons-Regular.ttf') format('truetype'); 13 | } 14 | 15 | .material-icons { 16 | direction: ltr; 17 | display: inline-block; 18 | font-family: 'Material Icons'; 19 | font-feature-settings: 'liga'; /* Support for IE */ 20 | font-size: 24px; /* Preferred icon size */ 21 | -moz-osx-font-smoothing: grayscale; /* Support for Firefox */ 22 | -webkit-font-smoothing: antialiased; /* Support for all WebKit browsers */ 23 | font-style: normal; 24 | font-weight: normal; 25 | letter-spacing: normal; 26 | line-height: 1; 27 | text-rendering: optimizeLegibility; /* Support for Safari and Chrome */ 28 | text-transform: none; 29 | white-space: nowrap; 30 | word-wrap: normal; 31 | } 32 | -------------------------------------------------------------------------------- /test/app/app-name.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const helpers = require('yeoman-test'); 5 | const assert = require('yeoman-assert'); 6 | 7 | module.exports = () => { 8 | 9 | describe('when changing app name', () => { 10 | 11 | before(done => { 12 | this.generator = helpers 13 | .run(path.join(__dirname, '../../generators/app')) 14 | .withPrompts({ 15 | appName: 'Webpack Generator' 16 | }) 17 | .toPromise() 18 | .then(() => done()); 19 | }); 20 | 21 | it('should use the slugified app name as the angular package', () => { 22 | assert.fileContent('src/app/app.js', /angular\.module\('webpack-generator'/); 23 | }); 24 | 25 | it('should use the app name in the package.json', () => { 26 | assert.jsonFileContent('package.json', {name: 'webpack-generator'}); 27 | }); 28 | 29 | it('should use the app name for the HTML title', () => { 30 | assert.fileContent('src/public/index.html', /Webpack Generator<\/title>/); 31 | }); 32 | 33 | it('should use the slugified app name for the ng-app directive', () => { 34 | assert.fileContent('src/public/index.html', /ng-app="webpack-generator"/); 35 | }); 36 | 37 | }); 38 | 39 | }; 40 | -------------------------------------------------------------------------------- /templates/app/src/config/README.md: -------------------------------------------------------------------------------- 1 | # Configuration 2 | 3 | ## Environments 4 | 5 | To add an environment configuration file, just create a new `config.ENV.json` file. 6 | To use the new environment, you must create the related npm script. 7 | 8 | ##### e.g for an `integration` environment: 9 | 10 | - Create the `src/config/config.int.json` file 11 | - Create the related scripts in `package.json`: 12 | 13 | ```json 14 | "scripts": { 15 | "build:int": "rimraf dist && webpack --bail --progress --profile --env int", 16 | "serve:int": "webpack-dev-server --history-api-fallback --inline --progress --hot --env int" 17 | } 18 | ``` 19 | 20 | By default, the application is launched in `dev` environment. 21 | 22 | <% if (angularTranslate) { -%> 23 | ## [Angular Translate](https://angular-translate.github.io/) 24 | 25 | ### Configuration 26 | 27 | Locale translation files are located under `/src/config/i18n` folder. 28 | 29 | angular-translate is configured via the `$translateProvider` under `src/app/app.config.js` file. 30 | 31 | ### Asynchronous 32 | 33 | All translations from different languages are loaded asynchronously via a static asynchronous loader. 34 | 35 | https://angular-translate.github.io/docs/#/guide/12_asynchronous-loading#asynchronous-loading_using-staticfilesloader 36 | <% } -%> 37 | -------------------------------------------------------------------------------- /templates/app/test/unit/app.spec.js: -------------------------------------------------------------------------------- 1 | import AppModule from '../../src/app/app'; 2 | 3 | describe('App', () => { 4 | let <% if (angularTranslate) { %>$httpBackend, <% } %>$rootScope, $state, $location, $compile; 5 | 6 | beforeEach(window.module(AppModule)); 7 | 8 | beforeEach(inject(($injector) => { 9 | $rootScope = $injector.get('$rootScope'); 10 | $state = $injector.get('$state'); 11 | $location = $injector.get('$location'); 12 | $compile = $injector.get('$compile'); 13 | <% if (angularTranslate) { -%> 14 | $httpBackend = $injector.get('$httpBackend'); 15 | $httpBackend.whenGET('fr-FR.json').respond(200, {}); 16 | <% } -%> 17 | })); 18 | 19 | describe('Module', () => { 20 | it('App component should be visible when navigates to /', () => { 21 | $location.url('/'); 22 | $rootScope.$digest(); 23 | $state.current.component.should.equal('app'); 24 | }); 25 | }); 26 | 27 | describe('View', () => { 28 | let scope, template; 29 | 30 | beforeEach(() => { 31 | scope = $rootScope.$new(); 32 | template = $compile('<app></app>')(scope); 33 | scope.$apply(); 34 | }); 35 | 36 | it('Template should contains a title', () => { 37 | template.html().should.equal(<% if (angularTranslate) { -%>'app.title'<% } else { -%>'My App'<% } -%>); 38 | }); 39 | 40 | }); 41 | }); 42 | -------------------------------------------------------------------------------- /templates/app/src/styles-sass/abstracts/README.md: -------------------------------------------------------------------------------- 1 | # Abstracts 2 | 3 | The `abstracts/` folder gathers all Sass tools and helpers used across the project. Every global variable, function, mixin and placeholder should be put in here. 4 | 5 | The rule of thumb for this folder is that it should not output a single line of CSS when compiled on its own. These are nothing but Sass helpers. 6 | 7 | * `_variables.scss` 8 | * `_mixins.scss` 9 | * `_functions.scss` 10 | * `_placeholders.scss` 11 | 12 | When working on a very large project with a lot of abstract utilities, it might be interesting to group them by topic rather than type, for instance typography (`_typography.scss`), theming (`_theming.scss`), etc. Each file contains all the related helpers: variables, functions, mixins and placeholders. Doing so can make the code easier to browse and maintain, especially when files are getting very long. 13 | 14 | The `abstracts/` folder might also be called `utilities/` or `helpers/`, depending on what you prefer. 15 | 16 | ## Structure 17 | 18 | ``` 19 | styles/ 20 | | 21 | |– abstracts/ 22 | | |– _variables.scss # Sass Variables 23 | | |– _functions.scss # Sass Functions 24 | | |– _mixins.scss # Sass Mixins 25 | | |– _placeholders.scss # Sass Placeholders 26 | ``` 27 | 28 | ## Source 29 | 30 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 31 | -------------------------------------------------------------------------------- /templates/app/src/styles-less/abstracts/README.md: -------------------------------------------------------------------------------- 1 | # Abstracts 2 | 3 | The `abstracts/` folder gathers all Less tools and helpers used across the project. Every global variable, function, mixin and placeholder should be put in here. 4 | 5 | The rule of thumb for this folder is that it should not output a single line of CSS when compiled on its own. These are nothing but Less helpers. 6 | 7 | * `_variables.less` 8 | * `_mixins.less` 9 | * `_functions.less` 10 | * `_placeholders.less` 11 | 12 | When working on a very large project with a lot of abstract utilities, it might be interesting to group them by topic rather than type, for instance typography (`_typography.less`), theming (`_theming.less`), etc. Each file contains all the related helpers: variables, functions, mixins and placeholders. Doing so can make the code easier to browse and maintain, especially when files are getting very long. 13 | 14 | The `abstracts/` folder might also be called `utilities/` or `helpers/`, depending on what you prefer. 15 | 16 | ## Structure 17 | 18 | ``` 19 | styles/ 20 | | 21 | |– abstracts/ 22 | | |– _variables.less # Less Variables 23 | | |– _functions.less # Less Functions 24 | | |– _mixins.less # Less Mixins 25 | | |– _placeholders.less # Less Placeholders 26 | ``` 27 | 28 | ## Source 29 | 30 | Source (SASS guidelines applied to LESS): 31 | 32 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 33 | -------------------------------------------------------------------------------- /test/app/resource.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const helpers = require('yeoman-test'); 5 | const assert = require('yeoman-assert'); 6 | 7 | module.exports = () => { 8 | 9 | describe('when using restangular', () => { 10 | 11 | before(done => { 12 | this.generator = helpers 13 | .run(path.join(__dirname, '../../generators/app')) 14 | .withPrompts({ 15 | resource: 'restangular' 16 | }) 17 | .toPromise() 18 | .then(() => done()); 19 | }); 20 | 21 | it('should add restangular to the package.json', () => { 22 | assert.fileContent('package.json', 'restangular'); 23 | }); 24 | 25 | it('should import restangular in the angular modules', () => { 26 | assert.fileContent('src/app/app.js', 'import \'lodash\''); 27 | assert.fileContent('src/app/app.js', 'import \'restangular\''); 28 | assert.fileContent('src/app/app.js', /angular\.module\([\s\S]*, [\s\S]*?restangular/); 29 | }); 30 | }); 31 | 32 | describe('when using ngResource', () => { 33 | 34 | before(done => { 35 | this.generator = helpers 36 | .run(path.join(__dirname, '../../generators/app')) 37 | .withPrompts({ 38 | resource: 'ngResource' 39 | }) 40 | .toPromise() 41 | .then(() => done()); 42 | }); 43 | 44 | it('should add angular-resource to the package.json', () => { 45 | assert.fileContent('package.json', 'angular-resource'); 46 | }); 47 | 48 | it('should import angular-resource in the angular modules', () => { 49 | assert.fileContent('src/app/app.js', 'import ngResource from \'angular-resource\''); 50 | assert.fileContent('src/app/app.js', /angular\.module\([\s\S]*, [\s\S]*?ngResource/); 51 | }); 52 | }); 53 | }; 54 | -------------------------------------------------------------------------------- /test/app/tests.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const helpers = require('yeoman-test'); 5 | const assert = require('yeoman-assert'); 6 | 7 | module.exports = () => { 8 | 9 | describe('Unit tests', () => { 10 | 11 | before(done => { 12 | this.generator = helpers 13 | .run(path.join(__dirname, '../../generators/app')) 14 | .toPromise() 15 | .then(() => done()); 16 | }); 17 | 18 | it('should write karma.conf.js', () => { 19 | assert.file('karma.conf.js'); 20 | }); 21 | 22 | it('should add karma/mocha packages to the package.json', () => { 23 | assert.fileContent('package.json', /"devDependencies": {[^}]*"babel-plugin-istanbul": "\^[\w\.\-]+"/); 24 | assert.fileContent('package.json', /"devDependencies": {[^}]*"karma": "\^[\w\.\-]+"/); 25 | assert.fileContent('package.json', /"devDependencies": {[^}]*"mocha": "\^[\w\.\-]+"/); 26 | assert.fileContent('package.json', /"devDependencies": {[^}]*"chai": "\^[\w\.\-]+"/); 27 | assert.fileContent('package.json', /"devDependencies": {[^}]*"karma-webpack": "\^[\w\.\-]+"/); 28 | assert.fileContent('package.json', /"devDependencies": {[^}]*"karma-mocha": "\^[\w\.\-]+"/); 29 | assert.fileContent('package.json', /"devDependencies": {[^}]*"karma-chai": "\^[\w\.\-]+"/); 30 | assert.fileContent('package.json', /"devDependencies": {[^}]*"karma-phantomjs-launcher": "\^[\w\.\-]+"/); 31 | assert.fileContent('package.json', /"devDependencies": {[^}]*"karma-sourcemap-loader": "\^[\w\.\-]+"/); 32 | assert.fileContent('package.json', /"devDependencies": {[^}]*"karma-spec-reporter": "[\w\.\-]+"/); 33 | }); 34 | 35 | it('should write test files', () => { 36 | assert.file('test/unit.spec.js'); 37 | assert.file('test/unit/app.spec.js'); 38 | }); 39 | 40 | }); 41 | 42 | }; 43 | -------------------------------------------------------------------------------- /templates/app/COMMITS-CONVENTION.md: -------------------------------------------------------------------------------- 1 | # Git commit message convention 2 | 3 | ``` 4 | <type>(<scope>): <subject> 5 | 6 | <body> 7 | ``` 8 | 9 | All lines are wrapped at 100 characters ! 10 | 11 | ## Allowed `<type>` 12 | 13 | * feat (feature) 14 | * fix (bug fix) 15 | * docs (documentation) 16 | * style (formatting, missing semi colons, …) 17 | * refactor 18 | * test (when adding missing tests) 19 | * chore (maintain) 20 | 21 | ## Allowed `<scope>`: 22 | 23 | Scope could be anything specifying place of the commit change. For example $location, $browser, compiler, scope, ng:href, etc... 24 | 25 | ## Breaking changes 26 | 27 | All breaking changes have to be mentioned in message body, on separated line: 28 | 29 | ``` 30 | Breaks removed $browser.setUrl() method (use $browser.url(newUrl)) 31 | Breaks ng:repeat option is no longer supported on selects (use ng:options) 32 | ``` 33 | 34 | ## Message body 35 | 36 | uses the imperative, present tense: “change” not “changed” nor “changes” 37 | includes motivation for the change and contrasts with previous behavior 38 | 39 | ### Referencing issues 40 | 41 | Closed bugs should be listed on a separate line in the body prefixed with "Closes" keyword like this: 42 | 43 | ``` 44 | Closes #234 45 | ``` 46 | 47 | or in case of multiple issues: 48 | 49 | ``` 50 | Closes #123, #245, #992 51 | ``` 52 | 53 | ## Commit message hook 54 | 55 | To contribute, commit messages must follow the abobe convention. 56 | To be certain this convention is followed, install the given hook. 57 | 58 | Copy `tools/git/commit-msg.js` file to `.git/hooks/commit-msg` location: 59 | 60 | ```sh 61 | $ ln -s tools/git/commit-msg.js .git/hooks/commit-msg 62 | ``` 63 | 64 | ## Rebase 65 | 66 | Configure your local git yo pull in `rebase` mode instead of default `merge` mode: 67 | 68 | ```sh 69 | $ git config pull.rebase true 70 | ``` 71 | 72 | Among other things, this will avoid this king of messages: 73 | 74 | ``` 75 | Merge branch 'develop' of https://[URL] into develop 76 | ``` 77 | -------------------------------------------------------------------------------- /test/app/angular-translate.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const helpers = require('yeoman-test'); 5 | const assert = require('yeoman-assert'); 6 | 7 | module.exports = () => { 8 | 9 | describe('when using angular-translate', () => { 10 | 11 | before(done => { 12 | this.generator = helpers 13 | .run(path.join(__dirname, '../../generators/app')) 14 | .withPrompts({ 15 | otherModules: 'angular-translate' 16 | }) 17 | .toPromise() 18 | .then(() => done()); 19 | }); 20 | 21 | it('should add angular-translate to the package.json', () => { 22 | assert.fileContent('package.json', /"angular-translate"/); 23 | assert.fileContent('package.json', /"angular-translate-loader-static-files"/); 24 | }); 25 | 26 | it('should import angular-translate module', () => { 27 | assert.fileContent('src/app/app.js', 'import ngTranslate from \'angular-translate\''); 28 | assert.fileContent('src/app/app.js', 'import ngTranslateLoaderStaticFiles from \'angular-translate-loader-static-files\''); 29 | assert.fileContent('src/app/app.js', /angular\.module\([\s\S]*, [\s\S]*?ngTranslate/); 30 | assert.fileContent('src/app/app.js', /angular\.module\([\s\S]*, [\s\S]*?ngTranslateLoaderStaticFiles/); 31 | }); 32 | 33 | it('should copy locale files to build the build folder', () => { 34 | assert.fileContent('webpack.config.js', '{ from: \'src/config/i18n\' }'); 35 | }); 36 | 37 | it('should generate default locale files', () => { 38 | assert.file('src/config/i18n/fr.json'); 39 | assert.file('src/config/i18n/en.json'); 40 | }); 41 | 42 | it('should create an angular-translate section in config README', () => { 43 | assert.fileContent('src/config/README.md', 'Angular Translate'); 44 | }); 45 | 46 | it('should activate angular-sanitize no matter the user selection (angular-translate peer dependency)', () => { 47 | assert.fileContent('package.json', 'angular-sanitize'); 48 | assert.fileContent('src/app/app.js', 'import ngSanitize from \'angular-sanitize\''); 49 | assert.fileContent('src/app/app.js', /angular\.module\([\s\S]*, [\s\S]*?ngSanitize/); 50 | }); 51 | 52 | }); 53 | 54 | }; 55 | -------------------------------------------------------------------------------- /test/app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const helpers = require('yeoman-test'); 5 | const assert = require('yeoman-assert'); 6 | 7 | let testEnvironments = require('./app/environments.spec'); 8 | let testResource = require('./app/resource.spec'); 9 | let testAngularTranslate = require('./app/angular-translate.spec'); 10 | let testUIFrameworks = require('./app/ui-frameworks.spec'); 11 | let testLinters = require('./app/linters.spec'); 12 | let testCSSPreprocessors = require('./app/css-preprocessors.spec'); 13 | let testSonar = require('./app/sonar.spec'); 14 | let testJSONServer = require('./app/json-server.spec'); 15 | let testAppName = require('./app/app-name.spec'); 16 | let testDocsGenerator = require('./app/dgeni.spec'); 17 | let testTests = require('./app/tests.spec'); 18 | 19 | /** 20 | * Test app generator. 21 | */ 22 | describe('app', () => { 23 | 24 | describe('default settings', () => { 25 | before(done => { 26 | this.generator = helpers 27 | .run(path.join(__dirname, '../generators/app')) 28 | .toPromise() 29 | .then(() => done()); 30 | }); 31 | 32 | it('should generate a README file', () => { 33 | assert.file('README.md'); 34 | }); 35 | 36 | it('should generate a CHANGELOG.md file', () => { 37 | assert.file('CHANGELOG.md'); 38 | }); 39 | 40 | it('should generate a commits convention', () => { 41 | assert.file('COMMITS-CONVENTION.md'); 42 | assert.file('tools/git/commit-msg.js'); 43 | }); 44 | 45 | it('should generate the PostCSS configuration file', () => { 46 | assert.file('postcss.config.js'); 47 | }); 48 | 49 | it('should generate a main SASS file', () => { 50 | assert.file('src/styles/main.scss'); 51 | assert.fileContent('src/styles/main.scss', ''); 52 | }); 53 | 54 | it('should add ui-router to the package.json', () => { 55 | assert.fileContent('package.json', /"dependencies": {[^}]*"angular-ui-router": "\^[\w\.\-]+"/); 56 | }); 57 | 58 | it('should import ui-router in the app modules', () => { 59 | assert.fileContent('src/app/app.js', 'import uiRouter from \'angular-ui-router\';'); 60 | assert.fileContent('src/app/app.js', /angular\.module\([\s\S]*, [\s\S]*?uiRouter/); 61 | }); 62 | }); 63 | 64 | testResource(); 65 | testEnvironments(); 66 | testAngularTranslate(); 67 | testUIFrameworks(); 68 | testLinters(); 69 | testCSSPreprocessors(); 70 | testSonar(); 71 | testJSONServer(); 72 | testAppName(); 73 | testDocsGenerator(); 74 | testTests(); 75 | 76 | }); 77 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). 6 | 7 | ## Unreleased 8 | 9 | ### Fixed 10 | 11 | - **sonar**: path to rules files from `.sreporterrc` were not good from [@ValentinGot] 12 | - **sonar**: path to tests folder were not good from [@ValentinGot] 13 | - **npm**: include `templates` folder in generated npm package (Closes [#2](https://github.com/groupe-sii/generator-webpack-angular/issues/2)) from [@ValentinGot] 14 | - **npm**: ._* files where globally ignored by npm (Closes [#2](https://github.com/groupe-sii/generator-webpack-angular/issues/2)) from [@ValentinGot] 15 | 16 | ## 0.0.3 - 2016-12-09 17 | 18 | ### Fixed 19 | 20 | - missing package version 21 | - **README**: add npm package version 22 | 23 | ## 0.0.2 - 2016-12-09 24 | 25 | ### Fixed 26 | 27 | - remove npm organization from [@ValentinGot] 28 | 29 | ## 0.0.1 - 2016-12-09 30 | 31 | ### Added 32 | 33 | - **css-preprocessors**: which CSS preprocessor do you want? from [@aguele] & [@jledentu] 34 | - **resource**: would you like to use a REST resource library? from [@ValentinGot] 35 | - **environments**: management application environments from [@ValentinGot] 36 | - **angular-translate**: angular-translate (18n for your Angular app, made easy!) from [@ValentinGot] 37 | - **ui-router**: use [AngularUI Router](https://github.com/angular-ui/ui-router) by default from [@jledentu] 38 | - **ui-frameworks**: Which UI framework do you want? from [@ValentinGot] 39 | - **linting**: Add ESLint, HTMLHint, SCSSLint & CSSLint support from [@ValentinGot] 40 | - **package-manager**: Let's you choose between **npm** or **Yarn** package manager from [@ValentinGot] 41 | - **postcss**: Add PostCSS treatments from [@ValentinGot] 42 | - **debug**: Disable the [debug info](https://docs.angularjs.org/api/ng/provider/$compileProvider#debugInfoEnabled) in production environement from [@ole] 43 | - **sonar**: Generate linters reporters for the [SonarQube](https://github.com/groupe-sii/sonar-web-frontend-plugin) plugin from [@ValentinGot] 44 | - **json-server**: Allows you to easily create a RESTFull API for your application from [@ole] 45 | - **application name**: Let's you choose the name of your application from [@ole] 46 | - **documentation**: Generate documentation with dgeni from [@ole] 47 | - **tests**: Create unit tests with Karma from [@jledentu] 48 | 49 | [@aguele]: https://github.com/aguele 50 | [@jledentu]: https://github.com/jledentu 51 | [@ole]: https://github.com/liollury 52 | [@ValentinGot]: https://github.com/ValentinGot 53 | -------------------------------------------------------------------------------- /templates/app/src/styles-sass/README.md: -------------------------------------------------------------------------------- 1 | # SASS 2 | 3 | Sources: 4 | 5 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 6 | 7 | ## MAIN FILE 8 | 9 | The main file (usually labelled main.scss) should be the only Sass file from the whole code base not to begin with an underscore. This file should not contain anything but @import and comments. 10 | 11 | Files should be imported according to the folder they live in, one after the other in the following order: 12 | 13 | * abstracts/ 14 | * vendors/ 15 | * base/ 16 | * layout/ 17 | * components/ 18 | * pages/ 19 | * themes/ 20 | 21 | In order to preserve readability, the main file should respect these guidelines: 22 | 23 | * one file per @import; 24 | * one @import per line; 25 | * no new line between two imports from the same folder; 26 | * a new line after the last import from a folder; 27 | * file extensions and leading underscores omitted. 28 | 29 | ```scss 30 | @import 'abstracts/variables'; 31 | @import 'abstracts/functions'; 32 | @import 'abstracts/mixins'; 33 | @import 'abstracts/placeholders'; 34 | 35 | @import 'vendors/bootstrap'; 36 | @import 'vendors/jquery-ui'; 37 | 38 | @import 'base/reset'; 39 | @import 'base/typography'; 40 | 41 | @import 'layout/navigation'; 42 | @import 'layout/grid'; 43 | @import 'layout/header'; 44 | @import 'layout/footer'; 45 | @import 'layout/sidebar'; 46 | @import 'layout/forms'; 47 | 48 | @import 'components/buttons'; 49 | @import 'components/carousel'; 50 | @import 'components/cover'; 51 | @import 'components/dropdown'; 52 | 53 | @import 'pages/home'; 54 | @import 'pages/contact'; 55 | 56 | @import 'themes/theme'; 57 | @import 'themes/admin'; 58 | ``` 59 | 60 | There is another way of importing partials that I deem valid as well. On the bright side, it makes the file more readable. On the other hand, it makes updating it slightly more painful. Anyway, I’ll let you decide which is best, it does not matter much. For this way of doing, the main file should respect these guidelines: 61 | 62 | * one @import per folder; 63 | * a linebreak after @import; 64 | * each file on its own line; 65 | * a new line after the last import from a folder; 66 | * file extensions and leading underscores omitted. 67 | 68 | ```scss 69 | @import 70 | 'abstracts/variables', 71 | 'abstracts/functions', 72 | 'abstracts/mixins', 73 | 'abstracts/placeholders'; 74 | 75 | @import 76 | 'vendors/bootstrap', 77 | 'vendors/jquery-ui'; 78 | 79 | @import 80 | 'base/reset', 81 | 'base/typography'; 82 | 83 | @import 84 | 'layout/navigation', 85 | 'layout/grid', 86 | 'layout/header', 87 | 'layout/footer', 88 | 'layout/sidebar', 89 | 'layout/forms'; 90 | 91 | @import 92 | 'components/buttons', 93 | 'components/carousel', 94 | 'components/cover', 95 | 'components/dropdown'; 96 | 97 | @import 98 | 'pages/home', 99 | 'pages/contact'; 100 | 101 | @import 102 | 'themes/theme', 103 | 'themes/admin'; 104 | ``` -------------------------------------------------------------------------------- /test/app/css-preprocessors.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const helpers = require('yeoman-test'); 5 | const assert = require('yeoman-assert'); 6 | 7 | module.exports = () => { 8 | 9 | describe('when using CSS', () => { 10 | 11 | before(done => { 12 | this.generator = helpers 13 | .run(path.join(__dirname, '../../generators/app')) 14 | .withPrompts({ 15 | cssPreprocessor: 'css' 16 | }) 17 | .toPromise() 18 | .then(() => done()); 19 | }); 20 | 21 | it('should add a main.css file', () => { 22 | assert.file('src/styles/main.css'); 23 | }); 24 | 25 | it('should use CSSLint rules', () => { 26 | assert.file('src/.csslintrc'); 27 | assert.fileContent('package.json', 'csslint src/styles/'); 28 | assert.fileContent('package.json', '"csslint"'); 29 | }); 30 | 31 | }); 32 | 33 | describe('when using Sass', () => { 34 | 35 | before(done => { 36 | this.generator = helpers 37 | .run(path.join(__dirname, '../../generators/app')) 38 | .withPrompts({ 39 | cssPreprocessor: 'sass' 40 | }) 41 | .toPromise() 42 | .then(() => done()); 43 | }); 44 | 45 | it('should add a main.scss file', () => { 46 | assert.file('src/styles/main.scss'); 47 | }); 48 | 49 | it('should create a 7-1 pattern', () => { 50 | assert.file('src/styles/README.md'); 51 | assert.file('src/styles/abstracts/README.md'); 52 | assert.file('src/styles/base/README.md'); 53 | assert.file('src/styles/components/README.md'); 54 | assert.file('src/styles/layout/README.md'); 55 | assert.file('src/styles/pages/README.md'); 56 | assert.file('src/styles/themes/README.md'); 57 | assert.file('src/styles/vendors/README.md'); 58 | }); 59 | 60 | it('should use SASSLint rules', () => { 61 | assert.file('.sass-lint.yml'); 62 | assert.fileContent('package.json', 'sass-lint -v'); 63 | assert.fileContent('package.json', '"sasslintConfig": ".sass-lint.yml",'); 64 | }); 65 | 66 | }); 67 | 68 | describe('when using Less', () => { 69 | 70 | before(done => { 71 | this.generator = helpers 72 | .run(path.join(__dirname, '../../generators/app')) 73 | .withPrompts({ 74 | cssPreprocessor: 'less' 75 | }) 76 | .toPromise() 77 | .then(() => done()); 78 | }); 79 | 80 | it('should add a main.less file', () => { 81 | assert.file('src/styles/main.less'); 82 | }); 83 | 84 | it('should create a 7-1 pattern', () => { 85 | assert.file('src/styles/README.md'); 86 | assert.file('src/styles/abstracts/README.md'); 87 | assert.file('src/styles/base/README.md'); 88 | assert.file('src/styles/components/README.md'); 89 | assert.file('src/styles/layout/README.md'); 90 | assert.file('src/styles/pages/README.md'); 91 | assert.file('src/styles/themes/README.md'); 92 | assert.file('src/styles/vendors/README.md'); 93 | }); 94 | 95 | }); 96 | 97 | }; 98 | -------------------------------------------------------------------------------- /templates/app/src/styles-less/README.md: -------------------------------------------------------------------------------- 1 | # LESS 2 | 3 | Sources (SASS guidelines applied to LESS): 4 | 5 | [https://sass-guidelin.es](https://sass-guidelin.es/?utm_source=CSS-Weekly&utm_campaign=Issue-145&utm_medium=RSS#architecture) 6 | 7 | ## MAIN FILE 8 | 9 | The main file (usually labelled `main.less`) should be the only Less file from the whole code base not to begin with an underscore. This file should not contain anything but `@import` and comments. 10 | 11 | Files should be imported according to the folder they live in, one after the other in the following order: 12 | 13 | * `abstracts/` 14 | * `vendors/` 15 | * `base/` 16 | * `layout/` 17 | * `components/` 18 | * `pages/` 19 | * `themes/` 20 | 21 | In order to preserve readability, the main file should respect these guidelines: 22 | 23 | * one file per `@import`; 24 | * one `@import` per line; 25 | * no new line between two imports from the same folder; 26 | * a new line after the last import from a folder; 27 | * file extensions and leading underscores omitted. 28 | 29 | ```less 30 | @import 'abstracts/variables'; 31 | @import 'abstracts/functions'; 32 | @import 'abstracts/mixins'; 33 | @import 'abstracts/placeholders'; 34 | 35 | @import 'vendors/bootstrap'; 36 | @import 'vendors/jquery-ui'; 37 | 38 | @import 'base/reset'; 39 | @import 'base/typography'; 40 | 41 | @import 'layout/navigation'; 42 | @import 'layout/grid'; 43 | @import 'layout/header'; 44 | @import 'layout/footer'; 45 | @import 'layout/sidebar'; 46 | @import 'layout/forms'; 47 | 48 | @import 'components/buttons'; 49 | @import 'components/carousel'; 50 | @import 'components/cover'; 51 | @import 'components/dropdown'; 52 | 53 | @import 'pages/home'; 54 | @import 'pages/contact'; 55 | 56 | @import 'themes/theme'; 57 | @import 'themes/admin'; 58 | ``` 59 | 60 | There is another way of importing partials that I deem valid as well. On the bright side, it makes the file more readable. On the other hand, it makes updating it slightly more painful. Anyway, I’ll let you decide which is best, it does not matter much. For this way of doing, the main file should respect these guidelines: 61 | 62 | * one `@import` per folder; 63 | * a linebreak after `@import`; 64 | * each file on its own line; 65 | * a new line after the last import from a folder; 66 | * file extensions and leading underscores omitted. 67 | 68 | ```less 69 | @import 70 | 'abstracts/variables', 71 | 'abstracts/functions', 72 | 'abstracts/mixins', 73 | 'abstracts/placeholders'; 74 | 75 | @import 76 | 'vendors/bootstrap', 77 | 'vendors/jquery-ui'; 78 | 79 | @import 80 | 'base/reset', 81 | 'base/typography'; 82 | 83 | @import 84 | 'layout/navigation', 85 | 'layout/grid', 86 | 'layout/header', 87 | 'layout/footer', 88 | 'layout/sidebar', 89 | 'layout/forms'; 90 | 91 | @import 92 | 'components/buttons', 93 | 'components/carousel', 94 | 'components/cover', 95 | 'components/dropdown'; 96 | 97 | @import 98 | 'pages/home', 99 | 'pages/contact'; 100 | 101 | @import 102 | 'themes/theme', 103 | 'themes/admin'; 104 | ``` 105 | -------------------------------------------------------------------------------- /templates/app/src/app/app.js: -------------------------------------------------------------------------------- 1 | /* global process */ 2 | import angular from 'angular'; 3 | <% if (ngAnimate || uiFramework === 'ngMaterial' || uiFramework === 'bootstrap') { -%> 4 | import ngAnimate from 'angular-animate'; 5 | <% } -%> 6 | import ngAria from 'angular-aria'; 7 | <% if (ngCookies) { -%> 8 | import ngCookies from 'angular-cookies'; 9 | <% } -%> 10 | <% if (ngMessages) { -%> 11 | import ngMessages from 'angular-messages'; 12 | <% } -%> 13 | <% if (ngSanitize || angularTranslate) { -%> 14 | import ngSanitize from 'angular-sanitize'; 15 | <% } -%> 16 | <% if ((ngTouch || uiFramework === 'bootstrap') && uiFramework !== 'ngMaterial') { -%> 17 | import ngTouch from 'angular-touch'; 18 | <% } -%> 19 | <% if (uiFramework === 'ngMaterial') { -%> 20 | import ngMaterial from 'angular-material'; 21 | <% } -%> 22 | <% if (uiFramework === 'bootstrap') { -%> 23 | import ngBootstrap from 'angular-ui-bootstrap'; 24 | <% } -%> 25 | <% if (angularTranslate) { -%> 26 | import ngTranslate from 'angular-translate'; 27 | import ngTranslateLoaderStaticFiles from 'angular-translate-loader-static-files'; 28 | <% } -%> 29 | import uiRouter from 'angular-ui-router'; 30 | <% if (resource === 'ngResource') { -%> 31 | import ngResource from 'angular-resource'; 32 | <% } -%> 33 | <% if (resource === 'restangular') { -%> 34 | import 'lodash'; 35 | import 'restangular'; 36 | <% } -%> 37 | 38 | <% if (cssPreprocessor === 'sass') { -%> 39 | import '../styles/main.scss'; 40 | <% } else if (cssPreprocessor === 'less') { -%> 41 | import '../styles/main.less'; 42 | <% } else { -%> 43 | import '../styles/main.css'; 44 | <% } -%> 45 | <% if (uiFramework === 'ngMaterial') { -%> 46 | import 'angular-material/angular-material.css'; 47 | <% } -%> 48 | <% if (uiFramework === 'bootstrap') { -%> 49 | import 'bootstrap/dist/css/bootstrap.min.css'; 50 | <% } -%> 51 | 52 | import config from 'app.config'; 53 | 54 | import appConfig from './app.config'; 55 | import appRoute from './app.route'; 56 | import appComponent from './app.component'; 57 | 58 | export default angular.module('<%= _.slugify(appName) %>', [ 59 | <% if (ngAnimate || uiFramework === 'ngMaterial' || uiFramework === 'bootstrap') { -%> 60 | ngAnimate, 61 | <% } -%> 62 | ngAria, 63 | <% if (ngCookies) { -%> 64 | ngCookies, 65 | <% } -%> 66 | <% if (ngMessages) { -%> 67 | ngMessages, 68 | <% } -%> 69 | <% if (ngSanitize || angularTranslate) { -%> 70 | ngSanitize, 71 | <% } -%> 72 | <% if ((ngTouch || uiFramework === 'bootstrap') && uiFramework !== 'ngMaterial') { -%> 73 | ngTouch, 74 | <% } -%> 75 | <% if (uiFramework === 'ngMaterial') { -%> 76 | ngMaterial, 77 | <% } -%> 78 | <% if (uiFramework === 'bootstrap') { -%> 79 | ngBootstrap, 80 | <% } -%> 81 | <% if (angularTranslate) { -%> 82 | ngTranslate, 83 | ngTranslateLoaderStaticFiles, 84 | <% } -%> 85 | <% if (resource === 'ngResource') { -%> 86 | ngResource, 87 | <% } -%> 88 | <% if (resource === 'restangular') { -%> 89 | 'restangular', 90 | <% } -%> 91 | uiRouter 92 | ]) 93 | .config(appConfig) 94 | .config(appRoute) 95 | .constant('CONFIG', config) 96 | .constant('ENVIRONNEMENT', process.env.ENV_NAME) 97 | .component('app', appComponent) 98 | .name; 99 | -------------------------------------------------------------------------------- /test/app/sonar.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const helpers = require('yeoman-test'); 5 | const assert = require('yeoman-assert'); 6 | 7 | module.exports = () => { 8 | 9 | describe('when using sonar-web-frontend-reporters', () => { 10 | 11 | before(done => { 12 | this.generator = helpers 13 | .run(path.join(__dirname, '../../generators/app')) 14 | .withPrompts({ 15 | appName: 'Webpack Generator', 16 | otherModules: 'sonar-web-frontend-reporters' 17 | }) 18 | .toPromise() 19 | .then(() => done()); 20 | }); 21 | 22 | it('should add sonar-web-frontend-reporters to the package.json', () => { 23 | assert.fileContent('package.json', /"sonar-web-frontend-reporters"/); 24 | }); 25 | 26 | it('should create the reporters script', () => { 27 | assert.fileContent('package.json', /"sonar:reporters": "node_modules\/.bin\/sreporter"/); 28 | }); 29 | 30 | it('should generate the sonar-web-frontend-reporters configuration file', () => { 31 | assert.file('.sreporterrc'); 32 | }); 33 | 34 | it('should use the app name in the sonar-web-frontend-reporters configuration file', () => { 35 | assert.jsonFileContent('.sreporterrc', {projectName: 'Webpack Generator'}); 36 | }); 37 | 38 | it('should generate the sonar-web-frontend-plugin configuration file', () => { 39 | assert.file('sonar-project.properties'); 40 | }); 41 | 42 | it('should use the app name in the sonar-web-frontend-plugin configuration file', () => { 43 | assert.fileContent('sonar-project.properties', /sonar.projectKey=webpack-generator/); 44 | assert.fileContent('sonar-project.properties', /sonar.projectName=Webpack Generator/); 45 | }); 46 | 47 | it('should generate the filepath-loader.js file', () => { 48 | assert.file('filepath-loader.js'); 49 | }); 50 | 51 | it('should add filepath-loader in Webpack preLoaders', () => { 52 | assert.fileContent('webpack.config.js', `loader: path.join(__dirname, 'filepath-loader.js')`); 53 | }); 54 | 55 | describe('when using CSS', () => { 56 | 57 | before(done => { 58 | this.generator = helpers 59 | .run(path.join(__dirname, '../../generators/app')) 60 | .withPrompts({ 61 | cssPreprocessor: 'css', 62 | otherModules: 'sonar-web-frontend-reporters' 63 | }) 64 | .toPromise() 65 | .then(() => done()); 66 | }); 67 | 68 | it('should create CSSLint reporter', () => { 69 | assert.fileContent('.sreporterrc', 'csslint'); 70 | }); 71 | }); 72 | 73 | describe('when using SASS', () => { 74 | 75 | before(done => { 76 | this.generator = helpers 77 | .run(path.join(__dirname, '../../generators/app')) 78 | .withPrompts({ 79 | cssPreprocessor: 'sass', 80 | otherModules: 'sonar-web-frontend-reporters' 81 | }) 82 | .toPromise() 83 | .then(() => done()); 84 | }); 85 | 86 | it('should create SASSLint reporter', () => { 87 | assert.fileContent('.sreporterrc', 'sass-to-scsslint'); 88 | }); 89 | }); 90 | }); 91 | }; 92 | -------------------------------------------------------------------------------- /docs/STACK.md: -------------------------------------------------------------------------------- 1 | # Generator - Stack 2 | 3 | - [**AngularJS**](https://angularjs.org/): HTML enhanced for web apps! 4 | - [**Webpack**](https://webpack.github.io/): A bundler for javascript and friends. 5 | 6 | ## CSS preprocessors 7 | 8 | Let's you choose between these CSS preprocessors: 9 | 10 | - **CSS**: Pure CSS3. 11 | - [**Sass**](http://sass-lang.com/): CSS with superpowers. 12 | - [**Less**](http://lesscss.org/): The dynamic stylesheet language. 13 | 14 | ## UI Frameworks 15 | 16 | Let's you choose between these frameworks: 17 | 18 | - [**Bootstrap**](http://getbootstrap.com/): The most popular HTML, CSS, and JS framework. 19 | - [**Angular Material**](https://material.angularjs.org/latest/): The reference implementation of the Google's Material Design specification. 20 | 21 | ## Testing 22 | 23 | - [**Karma**](https://karma-runner.github.io/): Spectacular Test Runner for JavaScript. 24 | 25 | ## Linting 26 | 27 | - [**ESLint**](http://eslint.org/): The pluggable linting utility for JavaScript and JSX. 28 | - [**HTMLHint**](http://htmlhint.com/): A Static Code Analysis Tool for HTML. 29 | - [**SASSLint**](https://github.com/sasstools/sass-lint): Pure Node.js Sass linting. 30 | - [**CSSLint**](https://github.com/CSSLint/csslint): Automated linting of Cascading Stylesheets. 31 | 32 | ## Angular modules 33 | 34 | Let's you choose between these modules: 35 | 36 | - [**ngAnimate**](https://docs.angularjs.org/api/ngAnimate): Provides support for CSS-based animations (keyframes and transitions) as well as JavaScript-based animations via callback hooks. 37 | - [**ngCookies**](https://docs.angularjs.org/api/ngCookies): Provides a convenient wrapper for reading and writing browser cookies. 38 | - [**ngTouch**](https://docs.angularjs.org/api/ngTouch): Provides touch events and other helpers for touch-enabled devices. 39 | - [**ngSanitize**](https://docs.angularjs.org/api/ngSanitize): Provides functionality to sanitize HTML. 40 | - [**ngMessages**](https://docs.angularjs.org/api/ngMessages): Provides enhanced support for displaying messages within templates. 41 | 42 | ## Modules 43 | 44 | Let's you choose between these modules: 45 | 46 | - [**angular-translate**](https://angular-translate.github.io/): i18n in your Angular apps, made easy. 47 | - [**sonar-web-frontend-reporters**](https://github.com/groupe-sii/sonar-web-frontend-reporters): Create Front-End reporters for SonarQube. 48 | - [**json-server**](https://github.com/typicode/json-server): Allows you to easily create a RESTFull API for your application. 49 | 50 | ## Features 51 | 52 | - [**Babel**](https://babeljs.io/): Babel is a compiler for writing next generation JavaScript. 53 | - [**ng-annotate**](https://github.com/olov/ng-annotate): Add, remove and rebuild AngularJS dependency injection annotations. 54 | - [**PostCSS**](https://github.com/postcss/postcss): Transforming styles with JS plugins. 55 | - [**Autoprefixer**](https://github.com/postcss/autoprefixer): Parse CSS and add vendor prefixes to rules by [Can I Use](http://caniuse.com/). 56 | - [**Restangular**](https://github.com/mgonto/restangular): AngularJS service to handle Rest API Restful Resources properly and easily. 57 | - [**Commits conventions**](../templates/app/COMMITS-CONVENTION.md): Google for AngularJS Git commit guidelines. 58 | -------------------------------------------------------------------------------- /templates/app/README.md: -------------------------------------------------------------------------------- 1 | # README 2 | 3 | ## Table of contents 4 | 5 | 1. [Prerequisites](#prerequisites) 6 | 1. [Installation](#installation) 7 | 1. [Scripts](#scripts) 8 | 1. [Contribute - Git](#contribute-git) 9 | 1. [Configuration](#configuration) 10 | 1. [Documentation](#documentation) 11 | <% if (cssPreprocessor === 'sass' || cssPreprocessor === 'less') { -%> 12 | 1. [Styling](#styling) 13 | <% } -%> 14 | 15 | ## Prerequisites 16 | 17 | These modules must be globally installed: 18 | 19 | * [`eslint`](https://www.npmjs.com/package/eslint): Code analysis for JavaScript & AngularJS. 20 | * [`htmlhint`](https://www.npmjs.com/package/htmlhint): Code analysis for HTML. 21 | <% if (cssPreprocessor === 'css') { -%> 22 | * [`csslint`](https://www.npmjs.com/package/csslint): Code analysis for CSS. 23 | <% } else if (cssPreprocessor === 'sass') { -%> 24 | * [`sass-lint`](https://github.com/sasstools/sass-lint): Code analysis for Sass. 25 | <% } -%> 26 | 27 | ## Installation 28 | 29 | ```sh 30 | $ npm install # Development 31 | $ npm install --production # Production (only `dependencies`) 32 | ``` 33 | 34 | ## Scripts 35 | 36 | - `<%=packageManager -%> start` to launch `npm run server` and `json-server` (if checked) in parallel 37 | - `<%=packageManager -%> run serve` to launch a webpack-dev-server server on your source files 38 | - `<%=packageManager -%> run serve:prod` to launch a webpack-dev-server server on your source files in a **production** environment 39 | - `<%=packageManager -%> run build` to build an optimized version of your application in /dist 40 | - `<%=packageManager -%> run build:prod` to build an optimized version of your application in /dist in a **production** environment 41 | - `<%=packageManager -%> run test` to launch your unit tests with Karma 42 | - `<%=packageManager -%> run lint` to launch linting process 43 | <% if (sonarWebFrontendReporters) { -%> 44 | - `<%=packageManager -%> run sonar:reporters` to create the linters reporters for SonarQube plugin 45 | <% } -%> 46 | <% if (jsonServer) { -%> 47 | - `<%=packageManager -%> run json-server` to start a json-server 48 | <% } -%> 49 | 50 | ## Contribute - Git 51 | 52 | See [commits convention](COMMITS-CONVENTION.md). 53 | 54 | ## Configuration 55 | 56 | See [configuration documentation](src/config/README.md). 57 | 58 | ## Documentation 59 | 60 | Angular documentation is generated with [DGeni](https://github.com/angular/dgeni) 61 | 62 | Docs generation is performed by [webpack-angular-dgeni-plugin](https://github.com/groupe-sii/webpack-angular-dgeni-plugin/) 63 | 64 | Please refer to [Angular documentation](https://github.com/angular/angular.js/wiki/Writing-AngularJS-Documentation) for documentation comments. 65 | 66 | ### Configuration 67 | 68 | It's possible to include or exclude other glob link (default: `src/app/**/*`) in file `webpack.config.js` in `build` target. 69 | 70 | For more details about configuration, please refer to the [plugin documentation](https://github.com/groupe-sii/webpack-angular-dgeni-plugin). 71 | 72 | ### Launch 73 | 74 | Documentation is launched by adding `--docs` argument to webpack. Which is already done by default for `build` and `build:prod` NPM scripts. 75 | 76 | ### Static documentation 77 | 78 | Static documentation is written in markdown format under `docs` folder. 79 | 80 | <% if (cssPreprocessor === 'sass' || cssPreprocessor === 'less') { -%> 81 | ## Styling 82 | 83 | See styling [guidelines](src/styles/README.md). 84 | <% } -%> 85 | -------------------------------------------------------------------------------- /templates/app/tools/git/commit-msg.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Git COMMIT-MSG hook for validating commit message 5 | * See https://docs.google.com/document/d/1rk04jEuGfk9kYzfqCuOlPTSJw3hEDZJTBN5E5f1SALo/edit 6 | * 7 | * Installation: 8 | * $ ln -s tools/git/commit-msg.js .git/hooks/commit-msg 9 | */ 10 | 11 | 'use strict'; 12 | 13 | const fs = require('fs'), 14 | util = require('util'); 15 | 16 | const MAX_LENGTH = 100, 17 | PATTERN = /^(?:fixup!\s*)?(\w*)(\(([\w\$\.\*/-]*)\))?\: (.*)$/, 18 | IGNORED = /^WIP\:/, 19 | TYPES = { 20 | feat: true, 21 | fix: true, 22 | docs: true, 23 | style: true, 24 | refactor: true, 25 | perf: true, 26 | test: true, 27 | chore: true, 28 | revert: true 29 | }; 30 | 31 | let error = function () { 32 | let allowedTypes = []; 33 | 34 | for (let type in TYPES) { 35 | if (TYPES[type]) { 36 | allowedTypes.push(type); 37 | } 38 | } 39 | 40 | // gitx does not display it 41 | // http://gitx.lighthouseapp.com/projects/17830/tickets/294-feature-display-hook-error-message-when-hook-fails 42 | // https://groups.google.com/group/gitx/browse_thread/thread/a03bcab60844b812 43 | console.error('INVALID COMMIT MSG: ' + util.format.apply(null, arguments) + '.\nAllowed <type>: ' + allowedTypes.join(', ')); 44 | }; 45 | 46 | let validateMessage = function (message) { 47 | let isValid = true; 48 | 49 | if (IGNORED.test(message)) { 50 | console.log('Commit message validation ignored.'); 51 | return true; 52 | } 53 | 54 | if (message.length > MAX_LENGTH) { 55 | error('is longer than %d characters !', MAX_LENGTH); 56 | isValid = false; 57 | } 58 | 59 | let match = PATTERN.exec(message); 60 | 61 | if (!match) { 62 | error('does not match "<type>(<scope>): <subject>" ! was: ' + message); 63 | return false; 64 | } 65 | 66 | let type = match[1]; 67 | let scope = match[3]; 68 | let subject = match[4]; 69 | 70 | if (!TYPES.hasOwnProperty(type)) { 71 | error('"%s" is not allowed type !', type); 72 | return false; 73 | } 74 | 75 | // Some more ideas, do want anything like this ? 76 | // - allow only specific scopes (eg. fix(docs) should not be allowed ? 77 | // - auto correct the type to lower case ? 78 | // - auto correct first letter of the subject to lower case ? 79 | // - auto add empty line after subject ? 80 | // - auto remove empty () ? 81 | // - auto correct typos in type ? 82 | // - store incorrect messages, so that we can learn 83 | 84 | return isValid; 85 | }; 86 | 87 | 88 | let firstLineFromBuffer = function (buffer) { 89 | return buffer.toString().split('\n').shift(); 90 | }; 91 | 92 | // Publish for testing 93 | exports.validateMessage = validateMessage; 94 | 95 | // Hacky start if not run by jasmine :-D 96 | if (process.argv.join('').indexOf('jasmine-node') === -1) { 97 | let commitMsgFile = process.argv[2]; 98 | let incorrectLogFile = commitMsgFile.replace('COMMIT_EDITMSG', 'logs/incorrect-commit-msgs'); 99 | 100 | fs.readFile(commitMsgFile, function(err, buffer) { 101 | let msg = firstLineFromBuffer(buffer); 102 | 103 | if (!validateMessage(msg)) { 104 | fs.appendFile(incorrectLogFile, msg + '\n', function() { 105 | process.exit(1); 106 | }); 107 | } else { 108 | process.exit(0); 109 | } 110 | }); 111 | } 112 | -------------------------------------------------------------------------------- /templates/app/karma.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | let webpackConfig = require('./webpack.config'); 4 | 5 | module.exports = function (config) { 6 | 7 | config.set({ 8 | 9 | // base path that will be used to resolve all patterns (eg. files, exclude) 10 | basePath: '', 11 | 12 | // frameworks to use 13 | // available frameworks: https://npmjs.org/browse/keyword/karma-adapter 14 | frameworks: ['mocha', 'chai'], 15 | 16 | // list of files / patterns to load in the browser 17 | files: [ 18 | {pattern: 'test/unit.spec.js'} 19 | ], 20 | 21 | // list of files to exclude 22 | exclude: [], 23 | 24 | // preprocess matching files before serving them to the browser 25 | // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor 26 | preprocessors: { 27 | 'test/unit.spec.js': ['webpack', 'sourcemap'<% if (sonarWebFrontendReporters) { -%>, 'junit'<% } -%>] 28 | }, 29 | 30 | // test results reporter to use 31 | // possible values: 'dots', 'progress', 'spec' 32 | // available reporters: https://npmjs.org/browse/keyword/karma-reporter 33 | reporters: ['spec', <% if (sonarWebFrontendReporters) { -%>'junit', <% } -%>'coverage'], 34 | 35 | // enable / disable colors in the output (reporters and logs) 36 | colors: true, 37 | 38 | // level of logging 39 | // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG 40 | logLevel: config.LOG_INFO, 41 | 42 | // enable / disable watching file and executing tests whenever any file changes 43 | autoWatch: false, 44 | 45 | // start these browsers 46 | // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher 47 | browsers: ['PhantomJS'], 48 | 49 | specReporter: { 50 | maxLogLines: 5, // limit number of lines logged per test 51 | suppressErrorSummary: true, // do not print error summary 52 | suppressFailed: false, // do not print information about failed tests 53 | suppressPassed: false, // do not print information about passed tests 54 | suppressSkipped: true, // do not print information about skipped tests 55 | showSpecTiming: false // print the time elapsed for each spec 56 | }, 57 | 58 | <% if (sonarWebFrontendReporters) { -%> 59 | // Reference: https://github.com/groupe-sii/karma-junit7-sonarqube-reporter 60 | junitReporter: { 61 | outputFile: 'reports/sonar/js-ut.xml', 62 | suite: '' 63 | }, 64 | <% } -%> 65 | 66 | coverageReporter: { 67 | dir: '<%= (sonarWebFrontendReporters) ? "reports/sonar/" : "coverage/" -%>', 68 | reporters: [ 69 | { 70 | type: 'lcovonly', 71 | subdir: '.', 72 | file: 'js-ut.lcov' 73 | }<% if (!sonarWebFrontendReporters) { -%>, 74 | { 75 | type: 'html', 76 | subdir: 'html' 77 | } 78 | <% } -%> 79 | 80 | ] 81 | }, 82 | 83 | webpack: webpackConfig, 84 | 85 | webpackMiddleware: { 86 | noInfo: true, 87 | quiet: false, 88 | stats: { 89 | hash: false, 90 | version: false, 91 | assets: false, 92 | chunks: false, 93 | timings: false 94 | } 95 | }, 96 | 97 | // Continuous Integration mode 98 | // if true, Karma captures browsers, runs the tests and exits 99 | singleRun: true, 100 | 101 | // Concurrency level 102 | // how many browser should be started simultaneous 103 | concurrency: Infinity 104 | }); 105 | 106 | }; 107 | -------------------------------------------------------------------------------- /templates/app/_.sass-lint.yml: -------------------------------------------------------------------------------- 1 | # sass-lint config generated by make-sass-lint-config v0.1.2 2 | # 3 | # The following scss-lint Linters are not yet supported by sass-lint: 4 | # ElsePlacement, PropertyCount, SelectorDepth, UnnecessaryParentReference 5 | # Compass::* 6 | # 7 | # The following settings/values are unsupported by sass-lint: 8 | # Linter Indentation, option "allow_non_nested_indentation" 9 | # Linter Indentation, option "character" 10 | # Linter PropertySortOrder, option "separate_groups" 11 | # Linter SpaceBeforeBrace, option "allow_single_line_padding" 12 | # Linter VendorPrefix, option "identifier_list" 13 | 14 | files: 15 | include: './src/**/*.s+(a|c)ss' 16 | options: 17 | formatter: stylish 18 | merge-default-rules: false 19 | rules: 20 | border-zero: 21 | - 1 22 | - convention: zero 23 | brace-style: 24 | - 1 25 | - allow-single-line: true 26 | class-name-format: 27 | - 1 28 | - convention: hyphenatedlowercase 29 | clean-import-paths: 30 | - 1 31 | - filename-extension: false 32 | leading-underscore: false 33 | empty-line-between-blocks: 34 | - 1 35 | - ignore-single-line-rulesets: true 36 | extends-before-declarations: 1 37 | extends-before-mixins: 1 38 | final-newline: 39 | - 1 40 | - include: true 41 | force-attribute-nesting: 1 42 | force-element-nesting: 1 43 | force-pseudo-nesting: 1 44 | function-name-format: 45 | - 1 46 | - allow-leading-underscore: true 47 | convention: hyphenatedlowercase 48 | hex-length: 49 | - 1 50 | - style: long 51 | hex-notation: 52 | - 1 53 | - style: uppercase 54 | id-name-format: 55 | - 1 56 | - convention: hyphenatedlowercase 57 | indentation: 58 | - 1 59 | - size: 2 60 | leading-zero: 61 | - 1 62 | - include: false 63 | mixin-name-format: 64 | - 1 65 | - allow-leading-underscore: true 66 | convention: hyphenatedlowercase 67 | mixins-before-declarations: 1 68 | nesting-depth: 69 | - 1 70 | - max-depth: 6 71 | no-color-keywords: 1 72 | no-color-literals: 1 73 | no-css-comments: 1 74 | no-debug: 1 75 | no-duplicate-properties: 1 76 | no-empty-rulesets: 1 77 | no-ids: 1 78 | no-important: 0 79 | no-invalid-hex: 1 80 | no-mergeable-selectors: 1 81 | no-misspelled-properties: 82 | - 1 83 | - extra-properties: [] 84 | no-qualifying-elements: 85 | - 0 86 | - allow-element-with-attribute: false 87 | allow-element-with-class: false 88 | allow-element-with-id: false 89 | no-trailing-zero: 1 90 | no-url-protocols: 1 91 | no-vendor-prefixes: 92 | - 1 93 | - additional-identifiers: [] 94 | excluded-identifiers: [] 95 | placeholder-in-extend: 1 96 | placeholder-name-format: 97 | - 1 98 | - convention: hyphenatedlowercase 99 | property-sort-order: 100 | - 0 101 | - ignore-custom-properties: false 102 | quotes: 103 | - 1 104 | - style: single 105 | shorthand-values: 1 106 | single-line-per-selector: 1 107 | space-after-bang: 108 | - 1 109 | - include: false 110 | space-after-colon: 111 | - 1 112 | - include: true 113 | space-after-comma: 1 114 | space-before-bang: 115 | - 1 116 | - include: true 117 | space-before-brace: 118 | - 1 119 | - include: true 120 | space-before-colon: 1 121 | space-between-parens: 122 | - 1 123 | - include: false 124 | trailing-semicolon: 1 125 | url-quotes: 1 126 | variable-for-property: 127 | - 0 128 | - properties: [] 129 | variable-name-format: 130 | - 1 131 | - allow-leading-underscore: true 132 | convention: hyphenatedlowercase 133 | zero-unit: 1 134 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Generator Webpack Angular 2 | [![Build Status](https://travis-ci.org/groupe-sii/generator-webpack-angular.svg?branch=master)](https://travis-ci.org/groupe-sii/generator-webpack-angular) 3 | [![NPM version][npm-image]][npm-url] 4 | 5 | [npm-image]: https://badge.fury.io/js/generator-webpack-angular.svg 6 | [npm-url]: https://npmjs.org/package/generator-webpack-angular 7 | 8 | > Yeoman generator for building Single Page Apps with AngularJS, ES6, Webpack. 9 | 10 | ### This project is no longer maintained. Please use [Clea CLI](https://github.com/groupe-sii/clea-cli) instead, which is way more complete. 11 | 12 | ## Generator 13 | 14 | What's included in details over [here](docs/STACK.md) 15 | 16 | ### Stack 17 | 18 | [![AngularJS](assets/angularjs.png "AngularJS")](https://angularjs.org/) 19 | [![Webpack](assets/webpack.png "Webpack")](https://webpack.github.io/) 20 | [![Karma](assets/karma.png "Karma")](https://karma-runner.github.io) 21 | [![ESLint](assets/eslint.png "ESLint")](http://eslint.org/) 22 | 23 | ### CSS preprocessors 24 | 25 | ![CSS](assets/css3.png "CSS 3") 26 | [![Sass](assets/sass.png "Sass")](http://sass-lang.com/) 27 | [![Less](assets/less.png "Less")](http://lesscss.org/) 28 | 29 | ### UI Frameworks 30 | 31 | [![AngularJS Material](assets/angularjs-material.png "AngularJS Material")](https://material.angularjs.org/latest/) 32 | [![Bootstrap](assets/bootstrap.png "Bootstrap")](http://getbootstrap.com/) 33 | 34 | ### Modules 35 | 36 | [![angular-translate](assets/angular-translate.png "Angular Translate")](https://angular-translate.github.io/) 37 | [![json-server](assets/json-server.png "JSON Server")](https://github.com/typicode/json-server) 38 | [![SonarQube](assets/sonar-qube.png "sonar-web-frontend-reporters")](https://github.com/groupe-sii/sonar-web-frontend-reporters) 39 | 40 | ### Doc generator 41 | [![dgeni](assets/dgeni.png "DGeni")](https://github.com/angular/dgeni) 42 | 43 | ### Package Managers 44 | 45 | [![npm](assets/npm.png "npm")](https://www.npmjs.com/) 46 | [![Yarn](assets/yarn.png "Yarn")](https://yarnpkg.com/) 47 | 48 | ## Usage 49 | 50 | ### Install 51 | 52 | #### Install required tools `yo`: 53 | 54 | ```sh 55 | $ npm install -g yo 56 | ``` 57 | 58 | #### Install `generator-webpack-angular`: 59 | 60 | ```sh 61 | $ npm install generator-webpack-angular 62 | ``` 63 | 64 | ### Run 65 | 66 | #### Create a new directory, and go into: 67 | 68 | ```sh 69 | $ mkdir my-new-project && cd my-new-project 70 | ``` 71 | 72 | #### Run `yo webpack-angular`, and select desired technologies: 73 | 74 | ```sh 75 | $ yo webpack-angular 76 | ``` 77 | 78 | #### Use NPM scripts 79 | 80 | - `npm start` to launch `npm run server` and `json-server` (if checked) in parallel 81 | - `npm run serve` to launch a webpack-dev-server server on your source files 82 | - `npm run serve:prod` to launch a webpack-dev-server server on your source files in a **production** environment 83 | - `npm run build` to build an optimized version of your application in /dist + docs generation 84 | - `npm run build:prod` to build an optimized version of your application in /dist in a **production** environment + docs generation 85 | - `npm run test` to launch your unit tests with Karma 86 | - `npm run lint` to launch linting process 87 | - `npm run sonar:reporters` to create the linters reporters for SonarQube plugin (Only if it was chosen) 88 | - `npm run json-server` to start a json-server (Only if it was chosen) 89 | 90 | ## [Changelog](https://github.com/groupe-sii/generator-webpack-angular/blob/master/CHANGELOG.md) 91 | 92 | ## Roadmap 93 | 94 | - [x] How to call REST APIs ? ($resource, Restangular) 95 | - [x] Handle environments 96 | - [x] angular-translate support 97 | - [x] UI Router as default router 98 | - [x] CSS preprocessors (CSS, Sass, Less) 99 | - [x] Angular modules choice (angular-animate, angular-touch, ...) 100 | - [x] UI Frameworks choice (angular-material, bootstrap) 101 | - [x] Linters (ESLint, HTMLHint, SASSLint, CSSLint) 102 | - [x] PostCSS integration 103 | - [x] Mock server REST API with json-server 104 | - [x] Sonar reporters 105 | - [x] Ask user for application name 106 | - [x] Unit tests with Karma and Mocha 107 | - [x] Code coverage 108 | - [ ] Landing page post generation 109 | - [x] Dgeni to generate documentation 110 | 111 | ## License 112 | 113 | MIT License 114 | 115 | Copyright (c) 2016 Groupe SII 116 | -------------------------------------------------------------------------------- /templates/app/_.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ "eslint:recommended", "angular" ], 3 | "parserOptions": { 4 | "ecmaVersion": 6, 5 | "sourceType": "module" 6 | }, 7 | "rules": { 8 | "angular/no-service-method": 0, 9 | "no-template-curly-in-string": "error", 10 | "no-unsafe-negation": "error", 11 | "block-scoped-var": "error", 12 | "curly": "error", 13 | "default-case": "error", 14 | "dot-notation": "error", 15 | "eqeqeq": "error", 16 | "no-alert": "error", 17 | "no-caller": "error", 18 | "no-else-return": "error", 19 | "no-eq-null": "error", 20 | "no-eval": "error", 21 | "no-extra-bind": "error", 22 | "no-extra-label": "error", 23 | "no-floating-decimal": "error", 24 | "no-global-assign": "error", 25 | "no-implicit-coercion": "error", 26 | "no-implied-eval": "error", 27 | "no-iterator": "error", 28 | "no-labels": "error", 29 | "no-lone-blocks": "error", 30 | "no-loop-func": "error", 31 | "no-multi-spaces": "error", 32 | "no-multi-str": "error", 33 | "no-new-func": "error", 34 | "no-new-wrappers": "error", 35 | "no-new": "error", 36 | "no-octal-escape": "error", 37 | "no-param-reassign": "error", 38 | "no-proto": "error", 39 | "no-return-assign": ["error", "always"], 40 | "no-self-compare": "error", 41 | "no-sequences": "error", 42 | "no-throw-literal": "error", 43 | "no-unmodified-loop-condition": "error", 44 | "no-unused-expressions": "error", 45 | "no-unused-labels": "error", 46 | "no-useless-call": "error", 47 | "no-useless-concat": "error", 48 | "no-useless-escape": "error", 49 | "no-void": "error", 50 | "no-with": "error", 51 | "radix": "error", 52 | "no-label-var": "error", 53 | "no-shadow-restricted-names": "error", 54 | "no-undef-init": "error", 55 | "no-undef": ["error", { 56 | "typeof": true 57 | }], 58 | "no-use-before-define": ["error", "nofunc"], 59 | "strict": ["error", "safe"], 60 | "brace-style": "error", 61 | "comma-dangle": ["error", "never"], 62 | "comma-spacing": "error", 63 | "comma-style": "error", 64 | "func-call-spacing": ["error", "never"], 65 | "func-names": ["error", "never"], 66 | "indent": ["error", 2, { 67 | "SwitchCase": 2 68 | }], 69 | "key-spacing": ["error", { 70 | "align": "colon" 71 | }], 72 | "keyword-spacing": "error", 73 | "linebreak-style": ["error", "unix"], 74 | "max-depth": "warn", 75 | "space-before-function-paren": ["error", "always"], 76 | "max-nested-callbacks": ["warn", 4], 77 | "max-statements-per-line": "error", 78 | "new-cap": "error", 79 | "new-parens": "error", 80 | "no-array-constructor": "error", 81 | "no-lonely-if": "error", 82 | "no-mixed-operators": "error", 83 | "no-mixed-spaces-and-tabs": "error", 84 | "no-multiple-empty-lines": "error", 85 | "no-negated-condition": "error", 86 | "no-new-object": "error", 87 | "no-restricted-syntax": ["error", "WithStatement"], 88 | "no-trailing-spaces": "error", 89 | "no-unneeded-ternary": "error", 90 | "no-whitespace-before-property": "error", 91 | "object-curly-spacing": ["error", "always"], 92 | "operator-assignment": "error", 93 | "operator-linebreak": "error", 94 | "quote-props": ["error", "as-needed"], 95 | "quotes": ["error", "single", { 96 | "allowTemplateLiterals": true 97 | }], 98 | "semi-spacing": ["error", { 99 | "before": false, 100 | "after": true 101 | }], 102 | "semi": "error", 103 | "space-before-blocks": "error", 104 | "space-in-parens": "error", 105 | "space-infix-ops": "error", 106 | "space-unary-ops": "error", 107 | "spaced-comment": ["error", "always", { 108 | "line": { 109 | "exceptions": ["-"] 110 | }, 111 | "block": { 112 | "markers": ["!"], 113 | "balanced": true 114 | } 115 | }], 116 | "unicode-bom": "error", 117 | "arrow-parens": "error", 118 | "arrow-spacing": ["error", { 119 | "before": true, 120 | "after": true 121 | }], 122 | "generator-star-spacing": ["error", "both"], 123 | "no-duplicate-imports": ["error", { 124 | "includeExports": true 125 | }], 126 | "no-useless-computed-key": "error", 127 | "no-useless-constructor": "error", 128 | "no-useless-rename": "error", 129 | "rest-spread-spacing": "error", 130 | "symbol-description": "error", 131 | "template-curly-spacing": "error", 132 | "yield-star-spacing": ["error", "both"] 133 | }, 134 | "env": { 135 | "browser": true 136 | }, 137 | "globals": { 138 | "angular": true, 139 | "module": true, 140 | "inject": true, 141 | "require": true 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /templates/app/_package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "<%= _.slugify(appName) %>", 3 | "version": "0.0.1", 4 | "private": true, 5 | <% if (cssPreprocessor === 'sass') { -%> 6 | "sasslintConfig": ".sass-lint.yml", 7 | <% } -%> 8 | "scripts": { 9 | "build": "rimraf dist && webpack --bail --progress --profile --docs --env dev", 10 | "build:prod": "rimraf dist && webpack --bail --progress --profile --docs --env prod", 11 | "start": "npm-run-all --parallel serve<% if (jsonServer) { -%> json-server<% } -%>", 12 | "serve": "webpack-dev-server --history-api-fallback --inline --progress --hot --env dev", 13 | "serve:prod": "webpack-dev-server --history-api-fallback --inline --progress --hot --env prod", 14 | "test": "npm run lint && karma start", 15 | "test-watch": "karma start --auto-watch --no-single-run", 16 | "lint": "eslint src/ && htmlhint src/<% if (cssPreprocessor === 'css') { -%> && csslint src/styles/<% } else if (cssPreprocessor === 'sass') { -%> && sass-lint -v<% } -%>"<% if (sonarWebFrontendReporters || jsonServer) { -%>, 17 | <% } -%> 18 | <% if (sonarWebFrontendReporters) { -%> 19 | "sonar:reporters": "node_modules/.bin/sreporter"<% if (jsonServer) { -%>, 20 | <% } else { -%> 21 | 22 | <% } -%> 23 | <% } -%> 24 | <% if (jsonServer) { -%> 25 | "json-server": "json-server json-server/db.json --routes json-server/routes.json" 26 | <% } -%> 27 | }, 28 | "dependencies": { 29 | "angular": "^1.6.0", 30 | <% if (ngAnimate || uiFramework === 'ngMaterial' || uiFramework === 'bootstrap') { -%> 31 | "angular-animate": "^1.6.0", 32 | <% } -%> 33 | "angular-aria": "^1.6.0", 34 | <% if (ngCookies) { -%> 35 | "angular-cookies": "^1.6.0", 36 | <% } -%> 37 | <% if (uiFramework === 'ngMaterial') { -%> 38 | "angular-material": "^1.1.1", 39 | <% } -%> 40 | <% if (ngMessages) { -%> 41 | "angular-messages": "^1.6.0", 42 | <% } -%> 43 | <% if (ngSanitize || angularTranslate) { -%> 44 | "angular-sanitize": "^1.6.0", 45 | <% } -%> 46 | <% if ((ngTouch || uiFramework === 'bootstrap') && uiFramework !== 'ngMaterial') { -%> 47 | "angular-touch": "^1.6.0", 48 | <% } -%> 49 | <% if (resource === 'ngResource') { -%> 50 | "angular-resource": "^1.6.0", 51 | <% } -%> 52 | <% if (angularTranslate) { -%> 53 | "angular-translate": "^2.13.0", 54 | "angular-translate-loader-static-files": "^2.13.0", 55 | <% } -%> 56 | <% if (uiFramework === 'bootstrap') { -%> 57 | "angular-ui-bootstrap": "^2.2.0", 58 | "bootstrap": "^3.3.7", 59 | <% } -%> 60 | "angular-ui-router": "^1.0.0-beta.3"<% if (uiFramework === 'ngMaterial') { -%>, 61 | "material-design-icons": "^3.0.1"<% } -%> 62 | <% if (resource === 'restangular') { %>, 63 | "restangular": "^1.5.2"<% } %> 64 | }, 65 | "devDependencies": { 66 | "angular-mocks": "^1.6.0", 67 | "babel-core": "^6.17.0", 68 | "babel-loader": "^6.2.5", 69 | "babel-plugin-istanbul": "^3.0.0", 70 | "babel-preset-es2015": "^6.16.0", 71 | "chai": "^3.5.0", 72 | "copy-webpack-plugin": "^3.0.1", 73 | "css-loader": "^0.25.0", 74 | "webpack-angular-dgeni-plugin": "^0.0.1", 75 | "npm-run-all": "^3.1.2", 76 | <% if (cssPreprocessor === 'css') { -%> 77 | "csslint": "^1.0.4", 78 | <% } -%> 79 | "eslint": "^3.9.1", 80 | "eslint-config-angular": "^0.5.0", 81 | "eslint-plugin-angular": "^1.4.1", 82 | "extract-text-webpack-plugin": "^1.0.1", 83 | "file-loader": "^0.9.0", 84 | "html-webpack-plugin": "^2.7.1", 85 | "htmlhint": "^0.9.13", 86 | "json-loader": "^0.5.4", 87 | "karma": "^1.3.0", 88 | "karma-chai": "^0.1.0", 89 | "karma-coverage": "^1.1.1", 90 | <% if (sonarWebFrontendReporters) { -%> 91 | "karma-junit7-sonarqube-reporter": "^0.0.6", 92 | <% } -%> 93 | "karma-mocha": "^1.3.0", 94 | "karma-phantomjs-launcher": "^1.0.2", 95 | "karma-sourcemap-loader": "^0.3.7", 96 | "karma-spec-reporter": "0.0.26", 97 | "karma-webpack": "^1.8.0", 98 | <% if (cssPreprocessor === 'less') { -%> 99 | "less": "^2.7.1", 100 | "less-loader": "^2.2.3", 101 | <% } -%> 102 | "mocha": "^3.2.0", 103 | "ng-annotate-loader": "^0.2.0", 104 | <% if (cssPreprocessor === 'sass') { -%> 105 | "node-sass": "^3.10.1", 106 | <% } -%> 107 | "postcss-loader": "^1.1.1", 108 | "raw-loader": "^0.5.1", 109 | "rimraf": "^2.5.1", 110 | <% if (cssPreprocessor === 'sass') { -%> 111 | "sass-lint": "^1.10.2", 112 | "sass-loader": "^4.0.2", 113 | <% } -%> 114 | <% if (sonarWebFrontendReporters) { -%> 115 | "sonar-web-frontend-reporters": "^3.0.0", 116 | <% } -%> 117 | <% if (jsonServer) { -%> 118 | "json-server": "^0.9.2", 119 | <% } -%> 120 | "style-loader": "^0.13.1", 121 | "webpack": "^1.13.2", 122 | "webpack-dev-server": "^1.16.1", 123 | "webpack-merge": "^0.14.1" 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /test/app/ui-frameworks.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const helpers = require('yeoman-test'); 5 | const assert = require('yeoman-assert'); 6 | 7 | module.exports = () => { 8 | 9 | describe('when using AngularJS Material', () => { 10 | 11 | before(done => { 12 | this.generator = helpers 13 | .run(path.join(__dirname, '../../generators/app')) 14 | .withPrompts({ 15 | uiFramework: 'ngMaterial' 16 | }) 17 | .toPromise() 18 | .then(() => done()); 19 | }); 20 | 21 | it('should add angular-material to the package.json', () => { 22 | assert.fileContent('package.json', 'angular-material'); 23 | }); 24 | 25 | it('should import angular-material in the angular modules', () => { 26 | assert.fileContent('src/app/app.js', 'import ngMaterial from \'angular-material\''); 27 | assert.fileContent('src/app/app.js', 'import \'angular-material/angular-material.css\''); 28 | assert.fileContent('src/app/app.js', /angular\.module\([\s\S]*, [\s\S]*?ngMaterial/); 29 | }); 30 | 31 | it('should activate angular-animate no matter the user selection (angular-material peer dependency)', () => { 32 | assert.fileContent('package.json', 'angular-animate'); 33 | assert.fileContent('src/app/app.js', 'import ngAnimate from \'angular-animate\''); 34 | assert.fileContent('src/app/app.js', /angular\.module\([\s\S]*, [\s\S]*?ngAnimate/); 35 | }); 36 | 37 | it('should add material-design-icons', () => { 38 | assert.fileContent('package.json', 'material-design-icons'); 39 | }); 40 | 41 | it('shouldn\'t add angular-touch', () => { 42 | assert.noFileContent('package.json', 'angular-touch'); 43 | assert.noFileContent('src/app/app.js', 'import ngTouch from \'angular-touch\''); 44 | assert.noFileContent('src/app/app.js', /angular\.module\([\s\S]*, [\s\S]*?ngTouch/); 45 | }); 46 | 47 | describe('when using Sass', () => { 48 | 49 | before(done => { 50 | this.generator = helpers 51 | .run(path.join(__dirname, '../../generators/app')) 52 | .withPrompts({ 53 | cssPreprocessor: 'sass', 54 | uiFramework: 'ngMaterial' 55 | }) 56 | .toPromise() 57 | .then(() => done()); 58 | }); 59 | 60 | it('should add material-design-icons', () => { 61 | assert.file('src/styles/base/_typography.scss'); 62 | assert.file('src/styles/vendors/_material-icons.scss'); 63 | assert.fileContent('src/styles/main.scss', '@import \'vendors/material-icons\''); 64 | assert.fileContent('src/styles/main.scss', '@import \'base/typography\''); 65 | }); 66 | 67 | }); 68 | 69 | describe('when using Less', () => { 70 | 71 | before(done => { 72 | this.generator = helpers 73 | .run(path.join(__dirname, '../../generators/app')) 74 | .withPrompts({ 75 | cssPreprocessor: 'less', 76 | uiFramework: 'ngMaterial' 77 | }) 78 | .toPromise() 79 | .then(() => done()); 80 | }); 81 | 82 | it('should add material-design-icons', () => { 83 | assert.file('src/styles/base/_typography.less'); 84 | assert.file('src/styles/vendors/_material-icons.less'); 85 | assert.fileContent('src/styles/main.less', '@import \'vendors/material-icons\''); 86 | assert.fileContent('src/styles/main.less', '@import \'base/typography\''); 87 | }); 88 | 89 | }); 90 | 91 | }); 92 | 93 | describe('when using Bootstrap', () => { 94 | 95 | before(done => { 96 | this.generator = helpers 97 | .run(path.join(__dirname, '../../generators/app')) 98 | .withPrompts({ 99 | uiFramework: 'bootstrap' 100 | }) 101 | .toPromise() 102 | .then(() => done()); 103 | }); 104 | 105 | it('should add bootstrap & angular-ui-bootstrap to the package.json', () => { 106 | assert.fileContent('package.json', 'bootstrap'); 107 | assert.fileContent('package.json', 'angular-ui-bootstrap'); 108 | }); 109 | 110 | it('should activate angular-animate no matter the user selection (ui-bootstrap peer dependency)', () => { 111 | assert.fileContent('package.json', 'angular-animate'); 112 | assert.fileContent('src/app/app.js', 'import ngAnimate from \'angular-animate\''); 113 | assert.fileContent('src/app/app.js', /angular\.module\([\s\S]*, [\s\S]*?ngAnimate/); 114 | }); 115 | 116 | it('should activate angular-touch no matter the user selection (ui-bootstrap peer dependency)', () => { 117 | assert.fileContent('package.json', 'angular-touch'); 118 | assert.fileContent('src/app/app.js', 'import ngTouch from \'angular-touch\''); 119 | assert.fileContent('src/app/app.js', /angular\.module\([\s\S]*, [\s\S]*?ngTouch/); 120 | }); 121 | 122 | it('should import bootstrap & angular-ui-bootstrap in the angular modules', () => { 123 | assert.fileContent('src/app/app.js', 'import ngBootstrap from \'angular-ui-bootstrap\''); 124 | assert.fileContent('src/app/app.js', 'import \'bootstrap/dist/css/bootstrap.min.css\''); 125 | assert.fileContent('src/app/app.js', /angular\.module\([\s\S]*, [\s\S]*?ngBootstrap/); 126 | }); 127 | 128 | }); 129 | 130 | }; 131 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "eslint:recommended", 3 | "env": { 4 | "node": true, 5 | "mocha": true 6 | }, 7 | "parserOptions": { 8 | "ecmaVersion": 6 9 | }, 10 | "rules": { 11 | "no-template-curly-in-string": "error", 12 | "no-unsafe-negation": "error", 13 | "block-scoped-var": "error", 14 | "curly": "error", 15 | "default-case": "error", 16 | "dot-notation": "error", 17 | "dot-location": ["warn", "property"], 18 | "eqeqeq": "error", 19 | "guard-for-in": "error", 20 | "no-alert": "error", 21 | "no-caller": "error", 22 | "no-div-regex": "error", 23 | "no-else-return": "error", 24 | "no-eq-null": "error", 25 | "no-eval": "error", 26 | "no-extend-native": "error", 27 | "no-extra-bind": "error", 28 | "no-extra-label": "error", 29 | "no-floating-decimal": "error", 30 | "no-global-assign": "error", 31 | "no-implicit-coercion": "error", 32 | "no-implicit-globals": "error", 33 | "no-implied-eval": "error", 34 | "no-iterator": "error", 35 | "no-labels": "error", 36 | "no-lone-blocks": "error", 37 | "no-loop-func": "error", 38 | "no-multi-spaces": "error", 39 | "no-multi-str": "error", 40 | "no-new-func": "error", 41 | "no-new-wrappers": "error", 42 | "no-new": "error", 43 | "no-octal-escape": "error", 44 | "no-param-reassign": "error", 45 | "no-proto": "error", 46 | "no-return-assign": ["error", "always"], 47 | "no-self-compare": "error", 48 | "no-sequences": "error", 49 | "no-throw-literal": "error", 50 | "no-unmodified-loop-condition": "error", 51 | "no-unused-expressions": "error", 52 | "no-unused-labels": "error", 53 | "no-useless-call": "error", 54 | "no-useless-concat": "error", 55 | "no-useless-escape": "error", 56 | "no-void": "error", 57 | "no-warning-comments": "warn", 58 | "no-with": "error", 59 | "radix": "error", 60 | "no-label-var": "error", 61 | "no-restricted-globals": ["error", "event"], 62 | "no-shadow-restricted-names": "error", 63 | "no-undef-init": "error", 64 | "no-undef": ["error", { 65 | "typeof": true 66 | }], 67 | "no-use-before-define": ["error", "nofunc"], 68 | "strict": ["error", "safe"], 69 | "brace-style": "error", 70 | "comma-dangle": ["error", "never"], 71 | "comma-spacing": "error", 72 | "comma-style": "error", 73 | "func-call-spacing": ["error", "never"], 74 | "func-names": ["error", "never"], 75 | "indent": ["error", 2, { 76 | "SwitchCase": 1 77 | }], 78 | "key-spacing": ["error", { 79 | "beforeColon": false, 80 | "afterColon": true 81 | }], 82 | "keyword-spacing": "error", 83 | "linebreak-style": ["error", "unix"], 84 | "max-depth": "warn", 85 | "space-before-function-paren": ["error", "always"], 86 | "max-nested-callbacks": ["warn", 4], 87 | "max-params": ["warn", { 88 | "max": 4 89 | }], 90 | "max-statements-per-line": "error", 91 | "new-cap": ["error", { 92 | "newIsCap": true, 93 | "capIsNew": true 94 | }], 95 | "new-parens": "error", 96 | "no-array-constructor": "error", 97 | "no-lonely-if": "error", 98 | "no-mixed-operators": "error", 99 | "no-mixed-spaces-and-tabs": "error", 100 | "no-multiple-empty-lines": ["error", { 101 | "max": 1 102 | }], 103 | "no-negated-condition": "error", 104 | "no-new-object": "error", 105 | "no-restricted-syntax": ["error", "WithStatement"], 106 | "no-whitespace-before-property": "error", 107 | "no-trailing-spaces": "error", 108 | "no-unneeded-ternary": "error", 109 | "object-curly-spacing": ["error", "never"], 110 | "one-var": ["error", "never"], 111 | "one-var-declaration-per-line": "error", 112 | "operator-assignment": ["error", "always"], 113 | "operator-linebreak": ["error", "after"], 114 | "quote-props": ["error", "as-needed"], 115 | "quotes": ["error", "single", { 116 | "allowTemplateLiterals": true 117 | }], 118 | "semi-spacing": ["error", { 119 | "before": false, 120 | "after": true 121 | }], 122 | "semi": ["error", "always"], 123 | "space-before-blocks": ["error", "always"], 124 | "space-in-parens": ["error", "never"], 125 | "space-infix-ops": "error", 126 | "space-unary-ops": "error", 127 | "spaced-comment": ["error", "always", { 128 | "line": { 129 | "exceptions": ["-"] 130 | }, 131 | "block": { 132 | "markers": ["!"], 133 | "balanced": true 134 | } 135 | }], 136 | "unicode-bom": ["error", "never"], 137 | "arrow-parens": ["error", "as-needed"], 138 | "arrow-spacing": ["error", { 139 | "before": true, 140 | "after": true 141 | }], 142 | "constructor-super": "error", 143 | "generator-star-spacing": ["error", "both"], 144 | "no-class-assign": "error", 145 | "no-const-assign": "error", 146 | "no-dupe-class-members": "error", 147 | "no-duplicate-imports": ["error", { 148 | "includeExports": true 149 | }], 150 | "no-new-symbol": "error", 151 | "no-this-before-super": "error", 152 | "no-useless-computed-key": "error", 153 | "no-useless-constructor": "error", 154 | "no-useless-rename": "error", 155 | "require-yield": "error", 156 | "rest-spread-spacing": ["error", "never"], 157 | "symbol-description": "error", 158 | "template-curly-spacing": "error", 159 | "yield-star-spacing": ["error", "both"] 160 | } 161 | } 162 | -------------------------------------------------------------------------------- /generators/app/prompt.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * This class manages App Generator prompts. 5 | */ 6 | module.exports = class Prompt { 7 | 8 | /** 9 | * Ask the user to answer some questions. 10 | */ 11 | static questions (generator) { 12 | return generator.prompt([{ 13 | type: 'input', 14 | name: 'appName', 15 | message: 'What\'s the name of your application package?' 16 | }, { 17 | type: 'checkbox', 18 | name: 'ngModules', 19 | message: 'What Angular modules do you want?', 20 | store: true, 21 | choices: [ 22 | { 23 | name: 'ngAnimate', 24 | value: 'ngAnimate' 25 | }, 26 | { 27 | name: 'ngCookies', 28 | value: 'ngCookies' 29 | }, 30 | { 31 | name: 'ngTouch', 32 | value: 'ngTouch' 33 | }, 34 | { 35 | name: 'ngSanitize', 36 | value: 'ngSanitize' 37 | }, 38 | { 39 | name: 'ngMessages', 40 | value: 'ngMessages' 41 | } 42 | ] 43 | }, { 44 | type: 'list', 45 | name: 'resource', 46 | message: 'Would you like to use a REST resource library?', 47 | default: 'restangular', 48 | store: true, 49 | choices: [ 50 | { 51 | name: 'Restangular, an alternative service to handles RESTful requests', 52 | value: 'restangular' 53 | }, 54 | { 55 | name: 'ngResource, the official support for RESTful services', 56 | value: 'ngResource' 57 | }, 58 | { 59 | name: 'None, $http is enough!', 60 | value: '$http' 61 | } 62 | ] 63 | }, { 64 | type: 'list', 65 | name: 'uiFramework', 66 | message: 'Which UI framework do you want?', 67 | default: 'ngMaterial', 68 | store: true, 69 | choices: [ 70 | { 71 | name: 'Angular Material, the reference implementation of the Google\'s Material Design specification', 72 | value: 'ngMaterial' 73 | }, 74 | { 75 | name: 'Bootstrap, the most popular HTML, CSS, and JS framework', 76 | value: 'bootstrap' 77 | }, 78 | { 79 | name: 'None', 80 | value: 'none' 81 | } 82 | ] 83 | }, { 84 | type: 'list', 85 | name: 'cssPreprocessor', 86 | message: 'Which CSS preprocessor do you want?', 87 | default: 'sass', 88 | store: true, 89 | choices: [ 90 | { 91 | name: 'Sass (with Node-sass)', 92 | value: 'sass' 93 | }, 94 | { 95 | name: 'Less', 96 | value: 'less' 97 | }, 98 | { 99 | name: 'Plain CSS', 100 | value: 'css' 101 | } 102 | ] 103 | }, { 104 | type: 'checkbox', 105 | name: 'otherModules', 106 | message: 'Here are some modules you might be interested in', 107 | store: true, 108 | choices: [ 109 | { 110 | name: 'angular-translate (18n for your Angular app, made easy!)', 111 | value: 'angular-translate' 112 | }, 113 | { 114 | name: 'sonar-web-frontend-reporters, generate linters reporters for the SonarQube plugin', 115 | value: 'sonar-web-frontend-reporters' 116 | }, 117 | { 118 | name: 'json-server, a full fake REST API with zero coding in less than 30 seconds', 119 | value: 'json-server' 120 | } 121 | ] 122 | }, { 123 | type: 'list', 124 | name: 'packageManager', 125 | message: 'What package manager should i use to install your dependencies ?', 126 | default: 'npm', 127 | store: true, 128 | choices: [ 129 | { 130 | name: 'npm, a package manager for javascript', 131 | value: 'npm' 132 | }, 133 | { 134 | name: 'Yarn, Fast, reliable, and secure dependency management', 135 | value: 'yarn' 136 | } 137 | ] 138 | }]).then(answers => { 139 | 140 | // App name 141 | generator.props.appName = answers.appName; 142 | 143 | // Angular modules 144 | generator.props.ngAnimate = answers.ngModules && answers.ngModules.includes('ngAnimate'); 145 | generator.props.ngCookies = answers.ngModules && answers.ngModules.includes('ngCookies'); 146 | generator.props.ngTouch = answers.ngModules && answers.ngModules.includes('ngTouch'); 147 | generator.props.ngSanitize = answers.ngModules && answers.ngModules.includes('ngSanitize'); 148 | generator.props.ngMessages = answers.ngModules && answers.ngModules.includes('ngMessages'); 149 | 150 | // Resource 151 | generator.props.resource = answers.resource; 152 | 153 | // UI Framework 154 | generator.props.uiFramework = answers.uiFramework; 155 | 156 | // CSS preprocessor 157 | generator.props.cssPreprocessor = answers.cssPreprocessor; 158 | 159 | // Other modules 160 | generator.props.angularTranslate = answers.otherModules && answers.otherModules.includes('angular-translate'); 161 | generator.props.sonarWebFrontendReporters = answers.otherModules && answers.otherModules.includes('sonar-web-frontend-reporters'); 162 | generator.props.jsonServer = answers.otherModules && answers.otherModules.includes('json-server'); 163 | 164 | // Package manager 165 | generator.props.packageManager = answers.packageManager; 166 | 167 | }); 168 | } 169 | }; 170 | -------------------------------------------------------------------------------- /generators/app/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const _ = require('underscore.string'); 4 | const path = require('path'); 5 | const Base = require('yeoman-generator').Base; 6 | const yosay = require('yosay'); 7 | const chalk = require('chalk'); 8 | 9 | const prompt = require('./prompt'); 10 | const write = require('./write'); 11 | const pkg = require('../../package.json'); 12 | 13 | module.exports = class AppGenerator extends Base { 14 | 15 | /** 16 | * Constructor. 17 | */ 18 | constructor (...args) { 19 | super(...args); 20 | 21 | this.argument('appname', { 22 | type: String, 23 | required: false 24 | }); 25 | 26 | this.props = {_}; 27 | } 28 | 29 | /** 30 | * Initialize this generator. 31 | */ 32 | get initializing () { 33 | return { 34 | 35 | /** 36 | * Get version. 37 | */ 38 | version () { 39 | this.version = pkg.version; 40 | }, 41 | 42 | /** 43 | * Set app name. 44 | */ 45 | appName () { 46 | this.props.appname = this.appname || path.basename(process.cwd()); 47 | this.props.appname = _.slugify(_.humanize(this.props.appname)); 48 | }, 49 | 50 | /** 51 | * Define template context. 52 | */ 53 | paths () { 54 | this.sourceRoot(path.join(__dirname, '../../templates/app')); 55 | }, 56 | 57 | /** 58 | * Display a welcome message. 59 | */ 60 | welcome () { 61 | this.log(yosay( 62 | `Welcome to the ${chalk.red('Webpack Angular')} generator!` 63 | )); 64 | } 65 | }; 66 | } 67 | 68 | /** 69 | * Prompt the user for options. 70 | */ 71 | prompting () { 72 | return prompt.questions(this); 73 | } 74 | 75 | /** 76 | * Write configuration files. 77 | */ 78 | get configuring () { 79 | return { 80 | 81 | /** 82 | * Write configuration files. 83 | */ 84 | configFiles () { 85 | this.fs.copyTpl( 86 | this.templatePath('_.babelrc'), 87 | this.destinationPath('.babelrc') 88 | ); 89 | 90 | this.fs.copyTpl( 91 | this.templatePath('_.editorconfig'), 92 | this.destinationPath('.editorconfig') 93 | ); 94 | 95 | this.fs.copyTpl( 96 | this.templatePath('_.gitignore'), 97 | this.destinationPath('.gitignore') 98 | ); 99 | }, 100 | 101 | /** 102 | * Write package.json. 103 | */ 104 | packageJSON () { 105 | this.fs.copyTpl( 106 | this.templatePath('_package.json'), 107 | this.destinationPath('package.json'), 108 | this.props 109 | ); 110 | }, 111 | 112 | /** 113 | * Write linter files 114 | */ 115 | linters () { 116 | this.fs.copyTpl( 117 | this.templatePath('src/_.htmlhintrc'), 118 | this.destinationPath('src/.htmlhintrc') 119 | ); 120 | 121 | this.fs.copyTpl( 122 | this.templatePath('_.eslintrc'), 123 | this.destinationPath('.eslintrc') 124 | ); 125 | 126 | switch (this.props.cssPreprocessor) { 127 | case 'css': 128 | this.fs.copyTpl( 129 | this.templatePath('src/_.csslintrc'), 130 | this.destinationPath('src/.csslintrc') 131 | ); 132 | break; 133 | 134 | default: 135 | case 'sass': 136 | this.fs.copyTpl( 137 | this.templatePath('_.sass-lint.yml'), 138 | this.destinationPath('.sass-lint.yml') 139 | ); 140 | break; 141 | } 142 | } 143 | }; 144 | } 145 | 146 | /** 147 | * Write project files. 148 | */ 149 | get writing () { 150 | return write; 151 | } 152 | 153 | /** 154 | * Install dependencies. 155 | */ 156 | install () { 157 | switch (this.props.packageManager) { 158 | case 'yarn': 159 | this.runInstall('yarn', '--ignore-optional'); 160 | break; 161 | 162 | default: 163 | case 'npm': 164 | this.npmInstall(); 165 | break; 166 | } 167 | } 168 | 169 | /** 170 | * Say goodbye. 171 | */ 172 | end () { 173 | this.log(`It's time to use ${this.props.packageManager.charAt(0).toUpperCase() + this.props.packageManager.slice(1)} scripts:`); 174 | this.log(`- ${chalk.yellow.bold(`${this.props.packageManager} start`)} to launch ${chalk.bold('npm run server')} and ${chalk.bold('json-server')} (if checked in generator) in parallel`); 175 | this.log(`- ${chalk.yellow.bold(`${this.props.packageManager} run serve`)} to launch a webpack-dev-server server on your source files`); 176 | this.log(`- ${chalk.yellow.bold(`${this.props.packageManager} run serve:prod`)} to launch a webpack-dev-server server on your source files in a ${chalk.yellow.bold('production')} environment`); 177 | this.log(`- ${chalk.yellow.bold(`${this.props.packageManager} run build`)} to build an optimized version of your application in folder /dist`); 178 | this.log(`- ${chalk.yellow.bold(`${this.props.packageManager} run build:prod`)} to build an optimized version of your application in folder /dist in a ${chalk.yellow.bold('production')} environment`); 179 | this.log(`- ${chalk.yellow.bold(`${this.props.packageManager} run test`)} to launch your unit tests with Karma`); 180 | this.log(`- ${chalk.yellow.bold(`${this.props.packageManager} run lint`)} to launch linting process`); 181 | if (this.props.sonarWebFrontendReporters) { 182 | this.log(`- ${chalk.yellow.bold(`${this.props.packageManager} run sonar:reporters`)} to create the linters reporters for SonarQube plugin`); 183 | } 184 | if (this.props.jsonServer) { 185 | this.log(`- ${chalk.yellow.bold(`${this.props.packageManager} run json-server`)} to start a json-server`); 186 | } 187 | } 188 | }; 189 | -------------------------------------------------------------------------------- /generators/app/write.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * This class manages App Generator writings. 5 | */ 6 | module.exports = { 7 | 8 | /** 9 | * Write README. 10 | */ 11 | readme () { 12 | this.fs.copyTpl( 13 | this.templatePath('README.md'), 14 | this.destinationPath('README.md'), 15 | this.props 16 | ); 17 | }, 18 | 19 | /** 20 | * Write COMMITS-CONVENTION. 21 | */ 22 | commitsConvention () { 23 | this.fs.copyTpl( 24 | this.templatePath('COMMITS-CONVENTION.md'), 25 | this.destinationPath('COMMITS-CONVENTION.md'), 26 | this.props 27 | ); 28 | }, 29 | 30 | /** 31 | * Write CHANGELOG. 32 | */ 33 | changelog () { 34 | this.fs.copyTpl( 35 | this.templatePath('CHANGELOG.md'), 36 | this.destinationPath('CHANGELOG.md'), 37 | this.props 38 | ); 39 | }, 40 | 41 | /** 42 | * Write webpack.config.js. 43 | */ 44 | webpack () { 45 | this.fs.copyTpl( 46 | this.templatePath('webpack.config.js'), 47 | this.destinationPath('webpack.config.js'), 48 | this.props 49 | ); 50 | 51 | this.fs.copyTpl( 52 | this.templatePath('postcss.config.js'), 53 | this.destinationPath('postcss.config.js') 54 | ); 55 | }, 56 | 57 | /** 58 | * Write src directory. 59 | */ 60 | src () { 61 | this.fs.copyTpl( 62 | this.templatePath('src/app'), 63 | this.destinationPath('src/app'), 64 | this.props 65 | ); 66 | 67 | this.fs.copyTpl( 68 | this.templatePath('src/config/**!(i18n)'), 69 | this.destinationPath('src/config'), 70 | this.props 71 | ); 72 | 73 | this.fs.copyTpl( 74 | this.templatePath('src/public'), 75 | this.destinationPath('src/public'), 76 | this.props 77 | ); 78 | }, 79 | 80 | /** 81 | * Write tools directory 82 | */ 83 | tools () { 84 | this.fs.copyTpl( 85 | this.templatePath('tools/git'), 86 | this.destinationPath('tools/git'), 87 | this.props 88 | ); 89 | }, 90 | 91 | /** 92 | * Write styles. 93 | */ 94 | styles () { 95 | switch (this.props.cssPreprocessor) { 96 | case 'sass': 97 | this.fs.copyTpl( 98 | this.templatePath('src/styles-sass'), 99 | this.destinationPath('src/styles'), 100 | this.props 101 | ); 102 | break; 103 | 104 | case 'less': 105 | this.fs.copyTpl( 106 | this.templatePath('src/styles-less'), 107 | this.destinationPath('src/styles'), 108 | this.props 109 | ); 110 | break; 111 | 112 | default: 113 | this.fs.copyTpl( 114 | this.templatePath('src/styles'), 115 | this.destinationPath('src/styles'), 116 | this.props 117 | ); 118 | } 119 | }, 120 | 121 | /** 122 | * Write ui frameworks related files 123 | */ 124 | ui () { 125 | switch (this.props.uiFramework) { 126 | case 'ngMaterial': 127 | switch (this.props.cssPreprocessor) { 128 | case 'css': 129 | default: 130 | this.fs.copyTpl( 131 | this.templatePath('src/ui-angular-material/styles'), 132 | this.destinationPath('src/styles') 133 | ); 134 | break; 135 | 136 | case 'sass': 137 | this.fs.copyTpl( 138 | this.templatePath('src/ui-angular-material/styles-sass'), 139 | this.destinationPath('src/styles'), 140 | this.props 141 | ); 142 | break; 143 | 144 | case 'less': 145 | this.fs.copyTpl( 146 | this.templatePath('src/ui-angular-material/styles-less'), 147 | this.destinationPath('src/styles'), 148 | this.props 149 | ); 150 | break; 151 | } 152 | break; 153 | 154 | default: 155 | break; 156 | } 157 | }, 158 | 159 | /** 160 | * Write angular-translate locales 161 | */ 162 | angularTranslate () { 163 | if (this.props.angularTranslate) { 164 | this.fs.copyTpl( 165 | this.templatePath('src/config/i18n'), 166 | this.destinationPath('src/config/i18n'), 167 | this.props 168 | ); 169 | } 170 | }, 171 | 172 | /** 173 | * Write configuration for sonar-web-frontend-reporters 174 | */ 175 | sonarWebFrontendReporters () { 176 | if (this.props.sonarWebFrontendReporters) { 177 | this.fs.copyTpl( 178 | this.templatePath('_.sreporterrc'), 179 | this.destinationPath('.sreporterrc'), 180 | this.props 181 | ); 182 | 183 | this.fs.copyTpl( 184 | this.templatePath('_sonar-project.properties'), 185 | this.destinationPath('sonar-project.properties'), 186 | this.props 187 | ); 188 | 189 | this.fs.copyTpl( 190 | this.templatePath('filepath-loader.js'), 191 | this.destinationPath('filepath-loader.js'), 192 | this.props 193 | ); 194 | } 195 | }, 196 | 197 | /** 198 | * Write json-server examples 199 | */ 200 | jsonServer () { 201 | if (this.props.jsonServer) { 202 | this.fs.copyTpl( 203 | this.templatePath('json-server'), 204 | this.destinationPath('json-server'), 205 | this.props 206 | ); 207 | } 208 | }, 209 | 210 | /** 211 | * Write docs config 212 | */ 213 | docs () { 214 | this.fs.copyTpl( 215 | this.templatePath('docs/**/!(_index.ngdoc)'), 216 | this.destinationPath('docs'), 217 | this.props 218 | ); 219 | this.fs.copyTpl( 220 | this.templatePath('docs/_index.ngdoc'), 221 | this.destinationPath('docs/index.ngdoc'), 222 | this.props 223 | ); 224 | }, 225 | 226 | /** 227 | * Write test files 228 | */ 229 | tests () { 230 | this.fs.copyTpl( 231 | this.templatePath('test'), 232 | this.destinationPath('test'), 233 | this.props 234 | ); 235 | 236 | this.fs.copyTpl( 237 | this.templatePath('karma.conf.js'), 238 | this.destinationPath('karma.conf.js'), 239 | this.props 240 | ); 241 | } 242 | 243 | }; 244 | -------------------------------------------------------------------------------- /templates/app/webpack.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'), 4 | fs = require('fs'), 5 | webpack = require('webpack'), 6 | merge = require('webpack-merge'), 7 | HtmlWebpackPlugin = require('html-webpack-plugin'), 8 | ExtractTextPlugin = require('extract-text-webpack-plugin'), 9 | CopyWebpackPlugin = require('copy-webpack-plugin'), 10 | DocsGeneratorPlugin = require('webpack-angular-dgeni-plugin'); 11 | 12 | let TARGET = process.env.npm_lifecycle_event; 13 | 14 | // If a reference to 'karma' is found on the process arguments, then we should launch webpack in `test` mode 15 | let hasKarmaRef = process.argv.map((arg) => arg.includes('karma')).some((arg) => arg); 16 | if (TARGET === undefined && hasKarmaRef) { 17 | TARGET = 'test'; 18 | } 19 | 20 | // Determinate application environment 21 | let configPath = `${__dirname}/src/config`; 22 | let envPos = process.argv.indexOf('--env'); 23 | let docEnable = process.argv.indexOf('--docs') !== -1; 24 | let env = (envPos !== -1 && fs.existsSync(`${configPath}/config.${process.argv[++envPos]}.json`)) ? process.argv[envPos] : 'dev'; 25 | 26 | let common = { 27 | 28 | entry: path.join(__dirname, 'src/app/app.js'), 29 | 30 | module: { 31 | preLoaders: [], 32 | loaders: [{ 33 | test: /\.js$/, 34 | loaders: ['ng-annotate', 'babel'], 35 | exclude: /node_modules/ 36 | }, 37 | { 38 | test: /\.html$/, 39 | loader: 'raw' 40 | }, 41 | { 42 | test: /\.css$/, 43 | loaders: [ 'style-loader', 'css-loader?importLoaders=1', 'postcss-loader' ] 44 | }, 45 | { 46 | test: /\.json$/, 47 | loader: 'json' 48 | }, 49 | { 50 | test: /\.(png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot)$/, 51 | loader: 'file' 52 | }] 53 | }, 54 | 55 | plugins: [ 56 | new HtmlWebpackPlugin({ 57 | template: './src/public/index.html', 58 | inject: 'body' 59 | }), 60 | 61 | new webpack.DefinePlugin({ 62 | 'process.env':{ 63 | 'ENV_NAME': JSON.stringify(env) 64 | } 65 | }), 66 | 67 | new CopyWebpackPlugin([ 68 | <% if (angularTranslate) { -%> 69 | { from: 'src/config/i18n' } 70 | <% } -%> 71 | ]) 72 | ], 73 | 74 | devServer: { 75 | contentBase: './src/public', 76 | stats: 'minimal' 77 | }, 78 | 79 | resolve: { 80 | alias: { 81 | 'app.config': `${configPath}/config.${env}.json` 82 | } 83 | } 84 | }; 85 | 86 | // Development 87 | if (TARGET !== undefined && TARGET.startsWith('serve')) { 88 | module.exports = merge.smart(common, { 89 | module: { 90 | loaders: [<% if (cssPreprocessor === 'sass') { %> 91 | { 92 | test: /\.scss$/, 93 | loaders: ['style-loader', 'css-loader?sourceMap&importLoaders=1', 'postcss-loader', 'sass-loader?sourceMap'] 94 | }<% } else if (cssPreprocessor === 'less') { %> 95 | { 96 | test: /\.less$/, 97 | loaders: ['style-loader', 'css-loader?sourceMap&importLoaders=1', 'postcss-loader', 'less-loader?sourceMap'] 98 | }<% } else { %> 99 | { 100 | test: /\.css$/, 101 | loaders: [ 'style-loader', 'css-loader?importLoaders=1', 'postcss-loader' ] 102 | }<% } %>] 103 | }, 104 | devtool: 'cheap-module-eval-source-map' 105 | }); 106 | } 107 | 108 | // Production 109 | if (TARGET !== undefined && TARGET.startsWith('build')) { 110 | module.exports = merge.smart(common, { 111 | output: { 112 | path: __dirname + '/dist', 113 | publicPath: '/', 114 | filename: '[name].[hash].js', 115 | chunkFilename: '[name].[hash].js' 116 | }, 117 | 118 | module: { 119 | loaders: [<% if (cssPreprocessor === 'sass') { %> 120 | { 121 | test: /\.scss$/, 122 | loader: ExtractTextPlugin.extract('style-loader', ['css-loader?importLoaders=1', 'postcss-loader', 'sass-loader']) 123 | }<% } else if (cssPreprocessor === 'less') { %> 124 | { 125 | test: /\.less$/, 126 | loader: ExtractTextPlugin.extract('style-loader', ['css-loader?importLoaders=1', 'postcss-loader', 'less-loader']) 127 | }<% } else { %> 128 | { 129 | test: /\.css$/, 130 | loader: ExtractTextPlugin.extract('style-loader', ['css-loader?importLoaders=1', 'postcss-loader']) 131 | }<% } %> 132 | ] 133 | }, 134 | 135 | plugins: [ 136 | new webpack.NoErrorsPlugin(), 137 | new webpack.optimize.DedupePlugin(), 138 | new webpack.optimize.UglifyJsPlugin(), 139 | new CopyWebpackPlugin([{ 140 | from: __dirname + '/src/public' 141 | }]), 142 | new ExtractTextPlugin('[name].[hash].css'), 143 | 144 | new DocsGeneratorPlugin({ 145 | enable : docEnable, 146 | staticContent: './docs', 147 | sources : { 148 | include : 'src/app/**/**/*.js', 149 | basePath: 'src/app' 150 | }, 151 | output : 'dist-docs' 152 | }) 153 | ], 154 | }); 155 | } 156 | 157 | // Test 158 | if (TARGET !== undefined && (TARGET === 'test' || TARGET === 'test-watch')) { 159 | module.exports = merge.smart(common, { 160 | entry: {}, 161 | 162 | devtool: 'inline-source-map', 163 | 164 | module: { 165 | <% if (sonarWebFrontendReporters) { -%> 166 | preLoaders: [ 167 | // Add file path info in source code files 168 | { 169 | test: /\.spec\.js$/, 170 | loader: path.join(__dirname, 'filepath-loader.js'), 171 | include: path.resolve('test/unit') 172 | } 173 | ], 174 | <% } -%> 175 | loaders: [{ 176 | test: /\.js$/, 177 | loaders: ['ng-annotate', 'babel?' + JSON.stringify({ 178 | presets: ['es2015'], 179 | plugins: ['istanbul'] 180 | })], 181 | exclude: /node_modules/ 182 | },<% if (cssPreprocessor === 'sass') { %> 183 | { 184 | test: /\.scss$/, 185 | loaders: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader'] 186 | }<% } else if (cssPreprocessor === 'less') { %> 187 | { 188 | test: /\.less$/, 189 | loaders: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader'] 190 | }<% } else { %> 191 | { 192 | test: /\.css$/, 193 | loaders: ['style-loader', 'css-loader', 'postcss-loader'] 194 | }<% } %> 195 | ]} 196 | }); 197 | } 198 | 199 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | abbrev@1: 6 | version "1.0.9" 7 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" 8 | 9 | acorn-jsx@^3.0.0, acorn-jsx@^3.0.1: 10 | version "3.0.1" 11 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 12 | dependencies: 13 | acorn "^3.0.4" 14 | 15 | acorn@^3.0.4: 16 | version "3.3.0" 17 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 18 | 19 | acorn@^4.0.1: 20 | version "4.0.3" 21 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.3.tgz#1a3e850b428e73ba6b09d1cc527f5aaad4d03ef1" 22 | 23 | ajv-keywords@^1.0.0: 24 | version "1.2.0" 25 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.2.0.tgz#676c4f087bfe1e8b12dca6fda2f3c74f417b099c" 26 | 27 | ajv@^4.7.0: 28 | version "4.10.0" 29 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.10.0.tgz#7ae6169180eb199192a8b9a19fd0f47fc9ac8764" 30 | dependencies: 31 | co "^4.6.0" 32 | json-stable-stringify "^1.0.1" 33 | 34 | amdefine@>=0.0.4: 35 | version "1.0.1" 36 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 37 | 38 | ansi-escapes@^1.1.0: 39 | version "1.4.0" 40 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 41 | 42 | ansi-regex@^2.0.0: 43 | version "2.0.0" 44 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" 45 | 46 | ansi-styles@^2.0.0, ansi-styles@^2.2.1: 47 | version "2.2.1" 48 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 49 | 50 | argparse@^1.0.7: 51 | version "1.0.9" 52 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 53 | dependencies: 54 | sprintf-js "~1.0.2" 55 | 56 | array-differ@^1.0.0: 57 | version "1.0.0" 58 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" 59 | 60 | array-find-index@^1.0.1: 61 | version "1.0.2" 62 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 63 | 64 | array-union@^1.0.1: 65 | version "1.0.2" 66 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 67 | dependencies: 68 | array-uniq "^1.0.1" 69 | 70 | array-uniq@^1.0.1: 71 | version "1.0.3" 72 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 73 | 74 | arrify@^1.0.0: 75 | version "1.0.1" 76 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 77 | 78 | ast-query@^2.0.0: 79 | version "2.0.0" 80 | resolved "https://registry.yarnpkg.com/ast-query/-/ast-query-2.0.0.tgz#3588e79ad8de07ce50df1e781cc2bda1fd69a453" 81 | dependencies: 82 | acorn-jsx "^3.0.1" 83 | class-extend "^0.1.1" 84 | escodegen-wallaby "^1.6.7" 85 | lodash "^4.6.1" 86 | traverse "^0.6.6" 87 | 88 | async@^2.0.0: 89 | version "2.1.4" 90 | resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" 91 | dependencies: 92 | lodash "^4.14.0" 93 | 94 | balanced-match@^0.4.1: 95 | version "0.4.2" 96 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 97 | 98 | "binaryextensions@1 || 2": 99 | version "2.0.0" 100 | resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.0.0.tgz#e597d1a7a6a3558a2d1c7241a16c99965e6aa40f" 101 | 102 | boolbase@~1.0.0: 103 | version "1.0.0" 104 | resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 105 | 106 | brace-expansion@^1.0.0: 107 | version "1.1.6" 108 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 109 | dependencies: 110 | balanced-match "^0.4.1" 111 | concat-map "0.0.1" 112 | 113 | browser-stdout@1.3.0: 114 | version "1.3.0" 115 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" 116 | 117 | buffer-shims@^1.0.0: 118 | version "1.0.0" 119 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 120 | 121 | builtin-modules@^1.0.0: 122 | version "1.1.1" 123 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 124 | 125 | caller-path@^0.1.0: 126 | version "0.1.0" 127 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 128 | dependencies: 129 | callsites "^0.2.0" 130 | 131 | callsites@^0.2.0: 132 | version "0.2.0" 133 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 134 | 135 | camelcase-keys@^2.0.0: 136 | version "2.1.0" 137 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 138 | dependencies: 139 | camelcase "^2.0.0" 140 | map-obj "^1.0.0" 141 | 142 | camelcase@^2.0.0: 143 | version "2.1.1" 144 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 145 | 146 | capture-stack-trace@^1.0.0: 147 | version "1.0.0" 148 | resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" 149 | 150 | chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: 151 | version "1.1.3" 152 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 153 | dependencies: 154 | ansi-styles "^2.2.1" 155 | escape-string-regexp "^1.0.2" 156 | has-ansi "^2.0.0" 157 | strip-ansi "^3.0.0" 158 | supports-color "^2.0.0" 159 | 160 | cheerio@^0.19.0: 161 | version "0.19.0" 162 | resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.19.0.tgz#772e7015f2ee29965096d71ea4175b75ab354925" 163 | dependencies: 164 | css-select "~1.0.0" 165 | dom-serializer "~0.1.0" 166 | entities "~1.1.1" 167 | htmlparser2 "~3.8.1" 168 | lodash "^3.2.0" 169 | 170 | circular-json@^0.3.0: 171 | version "0.3.1" 172 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" 173 | 174 | class-extend@^0.1.0, class-extend@^0.1.1: 175 | version "0.1.2" 176 | resolved "https://registry.yarnpkg.com/class-extend/-/class-extend-0.1.2.tgz#8057a82b00f53f82a5d62c50ef8cffdec6fabc34" 177 | dependencies: 178 | object-assign "^2.0.0" 179 | 180 | cli-boxes@^1.0.0: 181 | version "1.0.0" 182 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 183 | 184 | cli-cursor@^1.0.1: 185 | version "1.0.2" 186 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" 187 | dependencies: 188 | restore-cursor "^1.0.1" 189 | 190 | cli-table@^0.3.1: 191 | version "0.3.1" 192 | resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" 193 | dependencies: 194 | colors "1.0.3" 195 | 196 | cli-width@^2.0.0: 197 | version "2.1.0" 198 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 199 | 200 | clone-stats@^0.0.1: 201 | version "0.0.1" 202 | resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" 203 | 204 | clone@^1.0.0: 205 | version "1.0.2" 206 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" 207 | 208 | co@^4.6.0: 209 | version "4.6.0" 210 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 211 | 212 | code-point-at@^1.0.0: 213 | version "1.1.0" 214 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 215 | 216 | colors@1.0.3: 217 | version "1.0.3" 218 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" 219 | 220 | commander@2.9.0: 221 | version "2.9.0" 222 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 223 | dependencies: 224 | graceful-readlink ">= 1.0.0" 225 | 226 | commondir@^1.0.1: 227 | version "1.0.1" 228 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 229 | 230 | concat-map@0.0.1: 231 | version "0.0.1" 232 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 233 | 234 | concat-stream@^1.4.6, concat-stream@^1.4.7: 235 | version "1.5.2" 236 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" 237 | dependencies: 238 | inherits "~2.0.1" 239 | readable-stream "~2.0.0" 240 | typedarray "~0.0.5" 241 | 242 | core-util-is@~1.0.0: 243 | version "1.0.2" 244 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 245 | 246 | create-error-class@^3.0.1: 247 | version "3.0.2" 248 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 249 | dependencies: 250 | capture-stack-trace "^1.0.0" 251 | 252 | cross-spawn@^4.0.0: 253 | version "4.0.2" 254 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" 255 | dependencies: 256 | lru-cache "^4.0.1" 257 | which "^1.2.9" 258 | 259 | css-select@~1.0.0: 260 | version "1.0.0" 261 | resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.0.0.tgz#b1121ca51848dd264e2244d058cee254deeb44b0" 262 | dependencies: 263 | boolbase "~1.0.0" 264 | css-what "1.0" 265 | domutils "1.4" 266 | nth-check "~1.0.0" 267 | 268 | css-what@1.0: 269 | version "1.0.0" 270 | resolved "https://registry.yarnpkg.com/css-what/-/css-what-1.0.0.tgz#d7cc2df45180666f99d2b14462639469e00f736c" 271 | 272 | currently-unhandled@^0.4.1: 273 | version "0.4.1" 274 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 275 | dependencies: 276 | array-find-index "^1.0.1" 277 | 278 | d@^0.1.1, d@~0.1.1: 279 | version "0.1.1" 280 | resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" 281 | dependencies: 282 | es5-ext "~0.10.2" 283 | 284 | dargs@^4.0.0: 285 | version "4.1.0" 286 | resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" 287 | dependencies: 288 | number-is-nan "^1.0.0" 289 | 290 | dateformat@^1.0.11: 291 | version "1.0.12" 292 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" 293 | dependencies: 294 | get-stdin "^4.0.1" 295 | meow "^3.3.0" 296 | 297 | debug@2.2.0: 298 | version "2.2.0" 299 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 300 | dependencies: 301 | ms "0.7.1" 302 | 303 | debug@^2.0.0, debug@^2.1.0, debug@^2.1.1: 304 | version "2.4.5" 305 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.4.5.tgz#34c7b12a1ca96674428f41fe92c49b4ce7cd0607" 306 | dependencies: 307 | ms "0.7.2" 308 | 309 | decamelize@^1.1.2: 310 | version "1.2.0" 311 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 312 | 313 | deep-extend@^0.4.0: 314 | version "0.4.1" 315 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" 316 | 317 | deep-is@~0.1.3: 318 | version "0.1.3" 319 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 320 | 321 | del@^2.0.2: 322 | version "2.2.2" 323 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 324 | dependencies: 325 | globby "^5.0.0" 326 | is-path-cwd "^1.0.0" 327 | is-path-in-cwd "^1.0.0" 328 | object-assign "^4.0.1" 329 | pify "^2.0.0" 330 | pinkie-promise "^2.0.0" 331 | rimraf "^2.2.8" 332 | 333 | detect-conflict@^1.0.0: 334 | version "1.0.1" 335 | resolved "https://registry.yarnpkg.com/detect-conflict/-/detect-conflict-1.0.1.tgz#088657a66a961c05019db7c4230883b1c6b4176e" 336 | 337 | detect-newline@^1.0.3: 338 | version "1.0.3" 339 | resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-1.0.3.tgz#e97b1003877d70c09af1af35bfadff168de4920d" 340 | dependencies: 341 | get-stdin "^4.0.1" 342 | minimist "^1.1.0" 343 | 344 | diff@1.4.0: 345 | version "1.4.0" 346 | resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" 347 | 348 | diff@^2.1.2: 349 | version "2.2.3" 350 | resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99" 351 | 352 | doctrine@^1.2.2: 353 | version "1.5.0" 354 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 355 | dependencies: 356 | esutils "^2.0.2" 357 | isarray "^1.0.0" 358 | 359 | dom-serializer@0, dom-serializer@~0.1.0: 360 | version "0.1.0" 361 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" 362 | dependencies: 363 | domelementtype "~1.1.1" 364 | entities "~1.1.1" 365 | 366 | domelementtype@1, domelementtype@~1.1.1: 367 | version "1.1.3" 368 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" 369 | 370 | domhandler@2.3: 371 | version "2.3.0" 372 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" 373 | dependencies: 374 | domelementtype "1" 375 | 376 | domutils@1.4: 377 | version "1.4.3" 378 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.4.3.tgz#0865513796c6b306031850e175516baf80b72a6f" 379 | dependencies: 380 | domelementtype "1" 381 | 382 | domutils@1.5: 383 | version "1.5.1" 384 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" 385 | dependencies: 386 | dom-serializer "0" 387 | domelementtype "1" 388 | 389 | duplexer2@^0.1.4: 390 | version "0.1.4" 391 | resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" 392 | dependencies: 393 | readable-stream "^2.0.2" 394 | 395 | editions@^1.1.1: 396 | version "1.3.3" 397 | resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.3.tgz#0907101bdda20fac3cbe334c27cbd0688dc99a5b" 398 | 399 | ejs@^2.3.1: 400 | version "2.5.5" 401 | resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.5.tgz#6ef4e954ea7dcf54f66aad2fe7aa421932d9ed77" 402 | 403 | entities@1.0: 404 | version "1.0.0" 405 | resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" 406 | 407 | entities@~1.1.1: 408 | version "1.1.1" 409 | resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" 410 | 411 | error-ex@^1.2.0: 412 | version "1.3.0" 413 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" 414 | dependencies: 415 | is-arrayish "^0.2.1" 416 | 417 | error@^7.0.2: 418 | version "7.0.2" 419 | resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" 420 | dependencies: 421 | string-template "~0.2.1" 422 | xtend "~4.0.0" 423 | 424 | es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: 425 | version "0.10.12" 426 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" 427 | dependencies: 428 | es6-iterator "2" 429 | es6-symbol "~3.1" 430 | 431 | es6-iterator@2: 432 | version "2.0.0" 433 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" 434 | dependencies: 435 | d "^0.1.1" 436 | es5-ext "^0.10.7" 437 | es6-symbol "3" 438 | 439 | es6-map@^0.1.3: 440 | version "0.1.4" 441 | resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" 442 | dependencies: 443 | d "~0.1.1" 444 | es5-ext "~0.10.11" 445 | es6-iterator "2" 446 | es6-set "~0.1.3" 447 | es6-symbol "~3.1.0" 448 | event-emitter "~0.3.4" 449 | 450 | es6-set@~0.1.3: 451 | version "0.1.4" 452 | resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" 453 | dependencies: 454 | d "~0.1.1" 455 | es5-ext "~0.10.11" 456 | es6-iterator "2" 457 | es6-symbol "3" 458 | event-emitter "~0.3.4" 459 | 460 | es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: 461 | version "3.1.0" 462 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" 463 | dependencies: 464 | d "~0.1.1" 465 | es5-ext "~0.10.11" 466 | 467 | es6-weak-map@^2.0.1: 468 | version "2.0.1" 469 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" 470 | dependencies: 471 | d "^0.1.1" 472 | es5-ext "^0.10.8" 473 | es6-iterator "2" 474 | es6-symbol "3" 475 | 476 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 477 | version "1.0.5" 478 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 479 | 480 | escodegen-wallaby@^1.6.7: 481 | version "1.6.8" 482 | resolved "https://registry.yarnpkg.com/escodegen-wallaby/-/escodegen-wallaby-1.6.8.tgz#903afc307b1a0df4a79797e523157fade70b1165" 483 | dependencies: 484 | esprima "^2.7.1" 485 | estraverse "^1.9.1" 486 | esutils "^2.0.2" 487 | optionator "^0.8.1" 488 | optionalDependencies: 489 | source-map "~0.2.0" 490 | 491 | escope@^3.6.0: 492 | version "3.6.0" 493 | resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" 494 | dependencies: 495 | es6-map "^0.1.3" 496 | es6-weak-map "^2.0.1" 497 | esrecurse "^4.1.0" 498 | estraverse "^4.1.1" 499 | 500 | eslint@~3.7.1: 501 | version "3.7.1" 502 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.7.1.tgz#7faa84599e0fea422f04bc32db49054051a3f11a" 503 | dependencies: 504 | chalk "^1.1.3" 505 | concat-stream "^1.4.6" 506 | debug "^2.1.1" 507 | doctrine "^1.2.2" 508 | escope "^3.6.0" 509 | espree "^3.3.1" 510 | estraverse "^4.2.0" 511 | esutils "^2.0.2" 512 | file-entry-cache "^2.0.0" 513 | glob "^7.0.3" 514 | globals "^9.2.0" 515 | ignore "^3.1.5" 516 | imurmurhash "^0.1.4" 517 | inquirer "^0.12.0" 518 | is-my-json-valid "^2.10.0" 519 | is-resolvable "^1.0.0" 520 | js-yaml "^3.5.1" 521 | json-stable-stringify "^1.0.0" 522 | levn "^0.3.0" 523 | lodash "^4.0.0" 524 | mkdirp "^0.5.0" 525 | natural-compare "^1.4.0" 526 | optionator "^0.8.1" 527 | path-is-inside "^1.0.1" 528 | pluralize "^1.2.1" 529 | progress "^1.1.8" 530 | require-uncached "^1.0.2" 531 | shelljs "^0.6.0" 532 | strip-bom "^3.0.0" 533 | strip-json-comments "~1.0.1" 534 | table "^3.7.8" 535 | text-table "~0.2.0" 536 | user-home "^2.0.0" 537 | 538 | espree@^3.3.1: 539 | version "3.3.2" 540 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.3.2.tgz#dbf3fadeb4ecb4d4778303e50103b3d36c88b89c" 541 | dependencies: 542 | acorn "^4.0.1" 543 | acorn-jsx "^3.0.0" 544 | 545 | esprima@^2.6.0, esprima@^2.7.1: 546 | version "2.7.3" 547 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 548 | 549 | esrecurse@^4.1.0: 550 | version "4.1.0" 551 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" 552 | dependencies: 553 | estraverse "~4.1.0" 554 | object-assign "^4.0.1" 555 | 556 | estraverse@^1.9.1: 557 | version "1.9.3" 558 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" 559 | 560 | estraverse@^4.1.1, estraverse@^4.2.0: 561 | version "4.2.0" 562 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 563 | 564 | estraverse@~4.1.0: 565 | version "4.1.1" 566 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" 567 | 568 | esutils@^2.0.2: 569 | version "2.0.2" 570 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 571 | 572 | event-emitter@~0.3.4: 573 | version "0.3.4" 574 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" 575 | dependencies: 576 | d "~0.1.1" 577 | es5-ext "~0.10.7" 578 | 579 | exit-hook@^1.0.0: 580 | version "1.1.1" 581 | resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" 582 | 583 | extend@^3.0.0: 584 | version "3.0.0" 585 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" 586 | 587 | external-editor@^1.1.0: 588 | version "1.1.1" 589 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" 590 | dependencies: 591 | extend "^3.0.0" 592 | spawn-sync "^1.0.15" 593 | tmp "^0.0.29" 594 | 595 | fast-levenshtein@~2.0.4: 596 | version "2.0.5" 597 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" 598 | 599 | figures@^1.3.5: 600 | version "1.7.0" 601 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 602 | dependencies: 603 | escape-string-regexp "^1.0.5" 604 | object-assign "^4.1.0" 605 | 606 | file-entry-cache@^2.0.0: 607 | version "2.0.0" 608 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 609 | dependencies: 610 | flat-cache "^1.2.1" 611 | object-assign "^4.0.1" 612 | 613 | find-up@^1.0.0: 614 | version "1.1.2" 615 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 616 | dependencies: 617 | path-exists "^2.0.0" 618 | pinkie-promise "^2.0.0" 619 | 620 | first-chunk-stream@^2.0.0: 621 | version "2.0.0" 622 | resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70" 623 | dependencies: 624 | readable-stream "^2.0.2" 625 | 626 | flat-cache@^1.2.1: 627 | version "1.2.1" 628 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.1.tgz#6c837d6225a7de5659323740b36d5361f71691ff" 629 | dependencies: 630 | circular-json "^0.3.0" 631 | del "^2.0.2" 632 | graceful-fs "^4.1.2" 633 | write "^0.2.1" 634 | 635 | formatio@1.1.1: 636 | version "1.1.1" 637 | resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" 638 | dependencies: 639 | samsam "~1.1" 640 | 641 | fs.realpath@^1.0.0: 642 | version "1.0.0" 643 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 644 | 645 | generate-function@^2.0.0: 646 | version "2.0.0" 647 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 648 | 649 | generate-object-property@^1.1.0: 650 | version "1.2.0" 651 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 652 | dependencies: 653 | is-property "^1.0.0" 654 | 655 | get-stdin@^4.0.1: 656 | version "4.0.1" 657 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 658 | 659 | gh-got@^2.2.0: 660 | version "2.4.0" 661 | resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-2.4.0.tgz#aa51418911ca5e4f92437114cd1209383a4aa019" 662 | dependencies: 663 | got "^5.2.0" 664 | object-assign "^4.0.1" 665 | pinkie-promise "^2.0.0" 666 | 667 | github-username@^2.0.0: 668 | version "2.1.0" 669 | resolved "https://registry.yarnpkg.com/github-username/-/github-username-2.1.0.tgz#200e5a104af42ba08a54096c708d4b6ec2fa256b" 670 | dependencies: 671 | gh-got "^2.2.0" 672 | meow "^3.5.0" 673 | 674 | glob@7.0.5: 675 | version "7.0.5" 676 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" 677 | dependencies: 678 | fs.realpath "^1.0.0" 679 | inflight "^1.0.4" 680 | inherits "2" 681 | minimatch "^3.0.2" 682 | once "^1.3.0" 683 | path-is-absolute "^1.0.0" 684 | 685 | glob@^6.0.1: 686 | version "6.0.4" 687 | resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" 688 | dependencies: 689 | inflight "^1.0.4" 690 | inherits "2" 691 | minimatch "2 || 3" 692 | once "^1.3.0" 693 | path-is-absolute "^1.0.0" 694 | 695 | glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: 696 | version "7.1.1" 697 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 698 | dependencies: 699 | fs.realpath "^1.0.0" 700 | inflight "^1.0.4" 701 | inherits "2" 702 | minimatch "^3.0.2" 703 | once "^1.3.0" 704 | path-is-absolute "^1.0.0" 705 | 706 | globals@^9.2.0: 707 | version "9.14.0" 708 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" 709 | 710 | globby@^4.0.0: 711 | version "4.1.0" 712 | resolved "https://registry.yarnpkg.com/globby/-/globby-4.1.0.tgz#080f54549ec1b82a6c60e631fc82e1211dbe95f8" 713 | dependencies: 714 | array-union "^1.0.1" 715 | arrify "^1.0.0" 716 | glob "^6.0.1" 717 | object-assign "^4.0.1" 718 | pify "^2.0.0" 719 | pinkie-promise "^2.0.0" 720 | 721 | globby@^5.0.0: 722 | version "5.0.0" 723 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 724 | dependencies: 725 | array-union "^1.0.1" 726 | arrify "^1.0.0" 727 | glob "^7.0.3" 728 | object-assign "^4.0.1" 729 | pify "^2.0.0" 730 | pinkie-promise "^2.0.0" 731 | 732 | got@^5.2.0: 733 | version "5.7.1" 734 | resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" 735 | dependencies: 736 | create-error-class "^3.0.1" 737 | duplexer2 "^0.1.4" 738 | is-redirect "^1.0.0" 739 | is-retry-allowed "^1.0.0" 740 | is-stream "^1.0.0" 741 | lowercase-keys "^1.0.0" 742 | node-status-codes "^1.0.0" 743 | object-assign "^4.0.1" 744 | parse-json "^2.1.0" 745 | pinkie-promise "^2.0.0" 746 | read-all-stream "^3.0.0" 747 | readable-stream "^2.0.5" 748 | timed-out "^3.0.0" 749 | unzip-response "^1.0.2" 750 | url-parse-lax "^1.0.0" 751 | 752 | graceful-fs@^4.1.2: 753 | version "4.1.11" 754 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 755 | 756 | "graceful-readlink@>= 1.0.0": 757 | version "1.0.1" 758 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 759 | 760 | grouped-queue@^0.3.0: 761 | version "0.3.3" 762 | resolved "https://registry.yarnpkg.com/grouped-queue/-/grouped-queue-0.3.3.tgz#c167d2a5319c5a0e0964ef6a25b7c2df8996c85c" 763 | dependencies: 764 | lodash "^4.17.2" 765 | 766 | growl@1.9.2: 767 | version "1.9.2" 768 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 769 | 770 | gruntfile-editor@^1.0.0: 771 | version "1.2.1" 772 | resolved "https://registry.yarnpkg.com/gruntfile-editor/-/gruntfile-editor-1.2.1.tgz#366fc1f93cbf045813e1448aef1da9f18289d5eb" 773 | dependencies: 774 | ast-query "^2.0.0" 775 | lodash "^4.6.1" 776 | 777 | has-ansi@^2.0.0: 778 | version "2.0.0" 779 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 780 | dependencies: 781 | ansi-regex "^2.0.0" 782 | 783 | has-flag@^1.0.0: 784 | version "1.0.0" 785 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 786 | 787 | hosted-git-info@^2.1.4: 788 | version "2.1.5" 789 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" 790 | 791 | html-wiring@^1.0.0: 792 | version "1.2.0" 793 | resolved "https://registry.yarnpkg.com/html-wiring/-/html-wiring-1.2.0.tgz#c5f90a776e0a27241dc6df9022c37186d0270f9e" 794 | dependencies: 795 | cheerio "^0.19.0" 796 | detect-newline "^1.0.3" 797 | 798 | htmlparser2@~3.8.1: 799 | version "3.8.3" 800 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" 801 | dependencies: 802 | domelementtype "1" 803 | domhandler "2.3" 804 | domutils "1.5" 805 | entities "1.0" 806 | readable-stream "1.1" 807 | 808 | ignore@^3.1.5: 809 | version "3.2.0" 810 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" 811 | 812 | imurmurhash@^0.1.4: 813 | version "0.1.4" 814 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 815 | 816 | indent-string@^2.1.0: 817 | version "2.1.0" 818 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 819 | dependencies: 820 | repeating "^2.0.0" 821 | 822 | inflight@^1.0.4: 823 | version "1.0.6" 824 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 825 | dependencies: 826 | once "^1.3.0" 827 | wrappy "1" 828 | 829 | inherits@2, inherits@~2.0.1: 830 | version "2.0.3" 831 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 832 | 833 | inherits@2.0.1: 834 | version "2.0.1" 835 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 836 | 837 | inquirer@^0.12.0: 838 | version "0.12.0" 839 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" 840 | dependencies: 841 | ansi-escapes "^1.1.0" 842 | ansi-regex "^2.0.0" 843 | chalk "^1.0.0" 844 | cli-cursor "^1.0.1" 845 | cli-width "^2.0.0" 846 | figures "^1.3.5" 847 | lodash "^4.3.0" 848 | readline2 "^1.0.1" 849 | run-async "^0.1.0" 850 | rx-lite "^3.1.2" 851 | string-width "^1.0.1" 852 | strip-ansi "^3.0.0" 853 | through "^2.3.6" 854 | 855 | inquirer@^1.0.2: 856 | version "1.2.3" 857 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-1.2.3.tgz#4dec6f32f37ef7bb0b2ed3f1d1a5c3f545074918" 858 | dependencies: 859 | ansi-escapes "^1.1.0" 860 | chalk "^1.0.0" 861 | cli-cursor "^1.0.1" 862 | cli-width "^2.0.0" 863 | external-editor "^1.1.0" 864 | figures "^1.3.5" 865 | lodash "^4.3.0" 866 | mute-stream "0.0.6" 867 | pinkie-promise "^2.0.0" 868 | run-async "^2.2.0" 869 | rx "^4.1.0" 870 | string-width "^1.0.1" 871 | strip-ansi "^3.0.0" 872 | through "^2.3.6" 873 | 874 | interpret@^1.0.0: 875 | version "1.0.1" 876 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" 877 | 878 | is-arrayish@^0.2.1: 879 | version "0.2.1" 880 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 881 | 882 | is-builtin-module@^1.0.0: 883 | version "1.0.0" 884 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 885 | dependencies: 886 | builtin-modules "^1.0.0" 887 | 888 | is-finite@^1.0.0: 889 | version "1.0.2" 890 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 891 | dependencies: 892 | number-is-nan "^1.0.0" 893 | 894 | is-fullwidth-code-point@^1.0.0: 895 | version "1.0.0" 896 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 897 | dependencies: 898 | number-is-nan "^1.0.0" 899 | 900 | is-fullwidth-code-point@^2.0.0: 901 | version "2.0.0" 902 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 903 | 904 | is-my-json-valid@^2.10.0: 905 | version "2.15.0" 906 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" 907 | dependencies: 908 | generate-function "^2.0.0" 909 | generate-object-property "^1.1.0" 910 | jsonpointer "^4.0.0" 911 | xtend "^4.0.0" 912 | 913 | is-path-cwd@^1.0.0: 914 | version "1.0.0" 915 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 916 | 917 | is-path-in-cwd@^1.0.0: 918 | version "1.0.0" 919 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 920 | dependencies: 921 | is-path-inside "^1.0.0" 922 | 923 | is-path-inside@^1.0.0: 924 | version "1.0.0" 925 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 926 | dependencies: 927 | path-is-inside "^1.0.1" 928 | 929 | is-promise@^2.1.0: 930 | version "2.1.0" 931 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 932 | 933 | is-property@^1.0.0: 934 | version "1.0.2" 935 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 936 | 937 | is-redirect@^1.0.0: 938 | version "1.0.0" 939 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 940 | 941 | is-resolvable@^1.0.0: 942 | version "1.0.0" 943 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 944 | dependencies: 945 | tryit "^1.0.1" 946 | 947 | is-retry-allowed@^1.0.0: 948 | version "1.1.0" 949 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" 950 | 951 | is-stream@^1.0.0: 952 | version "1.1.0" 953 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 954 | 955 | is-utf8@^0.2.0: 956 | version "0.2.1" 957 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 958 | 959 | isarray@0.0.1: 960 | version "0.0.1" 961 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 962 | 963 | isarray@^1.0.0, isarray@~1.0.0: 964 | version "1.0.0" 965 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 966 | 967 | isexe@^1.1.1: 968 | version "1.1.2" 969 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" 970 | 971 | istextorbinary@^2.1.0: 972 | version "2.1.0" 973 | resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.1.0.tgz#dbed2a6f51be2f7475b68f89465811141b758874" 974 | dependencies: 975 | binaryextensions "1 || 2" 976 | editions "^1.1.1" 977 | textextensions "1 || 2" 978 | 979 | js-yaml@^3.5.1: 980 | version "3.7.0" 981 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" 982 | dependencies: 983 | argparse "^1.0.7" 984 | esprima "^2.6.0" 985 | 986 | json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: 987 | version "1.0.1" 988 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 989 | dependencies: 990 | jsonify "~0.0.0" 991 | 992 | json3@3.3.2: 993 | version "3.3.2" 994 | resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" 995 | 996 | jsonify@~0.0.0: 997 | version "0.0.0" 998 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 999 | 1000 | jsonpointer@^4.0.0: 1001 | version "4.0.0" 1002 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" 1003 | 1004 | levn@^0.3.0, levn@~0.3.0: 1005 | version "0.3.0" 1006 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1007 | dependencies: 1008 | prelude-ls "~1.1.2" 1009 | type-check "~0.3.2" 1010 | 1011 | load-json-file@^1.0.0: 1012 | version "1.1.0" 1013 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1014 | dependencies: 1015 | graceful-fs "^4.1.2" 1016 | parse-json "^2.2.0" 1017 | pify "^2.0.0" 1018 | pinkie-promise "^2.0.0" 1019 | strip-bom "^2.0.0" 1020 | 1021 | lodash._baseassign@^3.0.0: 1022 | version "3.2.0" 1023 | resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" 1024 | dependencies: 1025 | lodash._basecopy "^3.0.0" 1026 | lodash.keys "^3.0.0" 1027 | 1028 | lodash._basecopy@^3.0.0: 1029 | version "3.0.1" 1030 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 1031 | 1032 | lodash._basecreate@^3.0.0: 1033 | version "3.0.3" 1034 | resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" 1035 | 1036 | lodash._getnative@^3.0.0: 1037 | version "3.9.1" 1038 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 1039 | 1040 | lodash._isiterateecall@^3.0.0: 1041 | version "3.0.9" 1042 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 1043 | 1044 | lodash.create@3.1.1: 1045 | version "3.1.1" 1046 | resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" 1047 | dependencies: 1048 | lodash._baseassign "^3.0.0" 1049 | lodash._basecreate "^3.0.0" 1050 | lodash._isiterateecall "^3.0.0" 1051 | 1052 | lodash.isarguments@^3.0.0: 1053 | version "3.1.0" 1054 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 1055 | 1056 | lodash.isarray@^3.0.0: 1057 | version "3.0.4" 1058 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 1059 | 1060 | lodash.keys@^3.0.0: 1061 | version "3.1.2" 1062 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 1063 | dependencies: 1064 | lodash._getnative "^3.0.0" 1065 | lodash.isarguments "^3.0.0" 1066 | lodash.isarray "^3.0.0" 1067 | 1068 | lodash@^3.2.0, lodash@^3.6.0: 1069 | version "3.10.1" 1070 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" 1071 | 1072 | lodash@^4.0.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.3.0, lodash@^4.6.1: 1073 | version "4.17.2" 1074 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" 1075 | 1076 | log-symbols@^1.0.1: 1077 | version "1.0.2" 1078 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" 1079 | dependencies: 1080 | chalk "^1.0.0" 1081 | 1082 | lolex@1.3.2: 1083 | version "1.3.2" 1084 | resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" 1085 | 1086 | loud-rejection@^1.0.0: 1087 | version "1.6.0" 1088 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 1089 | dependencies: 1090 | currently-unhandled "^0.4.1" 1091 | signal-exit "^3.0.0" 1092 | 1093 | lowercase-keys@^1.0.0: 1094 | version "1.0.0" 1095 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" 1096 | 1097 | lru-cache@^4.0.1: 1098 | version "4.0.2" 1099 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" 1100 | dependencies: 1101 | pseudomap "^1.0.1" 1102 | yallist "^2.0.0" 1103 | 1104 | map-obj@^1.0.0, map-obj@^1.0.1: 1105 | version "1.0.1" 1106 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 1107 | 1108 | mem-fs-editor@^2.0.0: 1109 | version "2.3.0" 1110 | resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-2.3.0.tgz#42a0ae1f55e76fd03f09e7c7b15b6307bdf5cb13" 1111 | dependencies: 1112 | commondir "^1.0.1" 1113 | deep-extend "^0.4.0" 1114 | ejs "^2.3.1" 1115 | glob "^7.0.3" 1116 | globby "^4.0.0" 1117 | mkdirp "^0.5.0" 1118 | multimatch "^2.0.0" 1119 | rimraf "^2.2.8" 1120 | through2 "^2.0.0" 1121 | vinyl "^1.1.0" 1122 | 1123 | mem-fs@^1.1.0: 1124 | version "1.1.3" 1125 | resolved "https://registry.yarnpkg.com/mem-fs/-/mem-fs-1.1.3.tgz#b8ae8d2e3fcb6f5d3f9165c12d4551a065d989cc" 1126 | dependencies: 1127 | through2 "^2.0.0" 1128 | vinyl "^1.1.0" 1129 | vinyl-file "^2.0.0" 1130 | 1131 | meow@^3.3.0, meow@^3.5.0: 1132 | version "3.7.0" 1133 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 1134 | dependencies: 1135 | camelcase-keys "^2.0.0" 1136 | decamelize "^1.1.2" 1137 | loud-rejection "^1.0.0" 1138 | map-obj "^1.0.1" 1139 | minimist "^1.1.3" 1140 | normalize-package-data "^2.3.4" 1141 | object-assign "^4.0.1" 1142 | read-pkg-up "^1.0.1" 1143 | redent "^1.0.0" 1144 | trim-newlines "^1.0.0" 1145 | 1146 | "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2: 1147 | version "3.0.3" 1148 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 1149 | dependencies: 1150 | brace-expansion "^1.0.0" 1151 | 1152 | minimist@0.0.8: 1153 | version "0.0.8" 1154 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1155 | 1156 | minimist@^1.1.0, minimist@^1.1.3: 1157 | version "1.2.0" 1158 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1159 | 1160 | mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: 1161 | version "0.5.1" 1162 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1163 | dependencies: 1164 | minimist "0.0.8" 1165 | 1166 | mocha@^3.1.0: 1167 | version "3.2.0" 1168 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3" 1169 | dependencies: 1170 | browser-stdout "1.3.0" 1171 | commander "2.9.0" 1172 | debug "2.2.0" 1173 | diff "1.4.0" 1174 | escape-string-regexp "1.0.5" 1175 | glob "7.0.5" 1176 | growl "1.9.2" 1177 | json3 "3.3.2" 1178 | lodash.create "3.1.1" 1179 | mkdirp "0.5.1" 1180 | supports-color "3.1.2" 1181 | 1182 | ms@0.7.1: 1183 | version "0.7.1" 1184 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 1185 | 1186 | ms@0.7.2: 1187 | version "0.7.2" 1188 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 1189 | 1190 | multimatch@^2.0.0: 1191 | version "2.1.0" 1192 | resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" 1193 | dependencies: 1194 | array-differ "^1.0.0" 1195 | array-union "^1.0.1" 1196 | arrify "^1.0.0" 1197 | minimatch "^3.0.0" 1198 | 1199 | mute-stream@0.0.5: 1200 | version "0.0.5" 1201 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" 1202 | 1203 | mute-stream@0.0.6: 1204 | version "0.0.6" 1205 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" 1206 | 1207 | natural-compare@^1.4.0: 1208 | version "1.4.0" 1209 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1210 | 1211 | node-status-codes@^1.0.0: 1212 | version "1.0.0" 1213 | resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" 1214 | 1215 | nopt@^3.0.0: 1216 | version "3.0.6" 1217 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 1218 | dependencies: 1219 | abbrev "1" 1220 | 1221 | normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: 1222 | version "2.3.5" 1223 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" 1224 | dependencies: 1225 | hosted-git-info "^2.1.4" 1226 | is-builtin-module "^1.0.0" 1227 | semver "2 || 3 || 4 || 5" 1228 | validate-npm-package-license "^3.0.1" 1229 | 1230 | nth-check@~1.0.0: 1231 | version "1.0.1" 1232 | resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" 1233 | dependencies: 1234 | boolbase "~1.0.0" 1235 | 1236 | number-is-nan@^1.0.0: 1237 | version "1.0.1" 1238 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1239 | 1240 | object-assign@^2.0.0: 1241 | version "2.1.1" 1242 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" 1243 | 1244 | object-assign@^4.0.1, object-assign@^4.1.0: 1245 | version "4.1.0" 1246 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" 1247 | 1248 | once@^1.3.0: 1249 | version "1.4.0" 1250 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1251 | dependencies: 1252 | wrappy "1" 1253 | 1254 | onetime@^1.0.0: 1255 | version "1.1.0" 1256 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" 1257 | 1258 | optionator@^0.8.1: 1259 | version "0.8.2" 1260 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1261 | dependencies: 1262 | deep-is "~0.1.3" 1263 | fast-levenshtein "~2.0.4" 1264 | levn "~0.3.0" 1265 | prelude-ls "~1.1.2" 1266 | type-check "~0.3.2" 1267 | wordwrap "~1.0.0" 1268 | 1269 | os-homedir@^1.0.0: 1270 | version "1.0.2" 1271 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1272 | 1273 | os-shim@^0.1.2: 1274 | version "0.1.3" 1275 | resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" 1276 | 1277 | os-tmpdir@~1.0.1: 1278 | version "1.0.2" 1279 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1280 | 1281 | pad-component@0.0.1: 1282 | version "0.0.1" 1283 | resolved "https://registry.yarnpkg.com/pad-component/-/pad-component-0.0.1.tgz#ad1f22ce1bf0fdc0d6ddd908af17f351a404b8ac" 1284 | 1285 | parse-json@^2.1.0, parse-json@^2.2.0: 1286 | version "2.2.0" 1287 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1288 | dependencies: 1289 | error-ex "^1.2.0" 1290 | 1291 | path-exists@^2.0.0, path-exists@^2.1.0: 1292 | version "2.1.0" 1293 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1294 | dependencies: 1295 | pinkie-promise "^2.0.0" 1296 | 1297 | path-is-absolute@^1.0.0: 1298 | version "1.0.1" 1299 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1300 | 1301 | path-is-inside@^1.0.1: 1302 | version "1.0.2" 1303 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1304 | 1305 | path-type@^1.0.0: 1306 | version "1.1.0" 1307 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1308 | dependencies: 1309 | graceful-fs "^4.1.2" 1310 | pify "^2.0.0" 1311 | pinkie-promise "^2.0.0" 1312 | 1313 | pify@^2.0.0, pify@^2.3.0: 1314 | version "2.3.0" 1315 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1316 | 1317 | pinkie-promise@^2.0.0, pinkie-promise@^2.0.1: 1318 | version "2.0.1" 1319 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1320 | dependencies: 1321 | pinkie "^2.0.0" 1322 | 1323 | pinkie@^2.0.0: 1324 | version "2.0.4" 1325 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1326 | 1327 | pluralize@^1.2.1: 1328 | version "1.2.1" 1329 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" 1330 | 1331 | prelude-ls@~1.1.2: 1332 | version "1.1.2" 1333 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1334 | 1335 | prepend-http@^1.0.1: 1336 | version "1.0.4" 1337 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 1338 | 1339 | pretty-bytes@^3.0.1: 1340 | version "3.0.1" 1341 | resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-3.0.1.tgz#27d0008d778063a0b4811bb35c79f1bd5d5fbccf" 1342 | dependencies: 1343 | number-is-nan "^1.0.0" 1344 | 1345 | process-nextick-args@~1.0.6: 1346 | version "1.0.7" 1347 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1348 | 1349 | progress@^1.1.8: 1350 | version "1.1.8" 1351 | resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" 1352 | 1353 | pseudomap@^1.0.1: 1354 | version "1.0.2" 1355 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1356 | 1357 | read-all-stream@^3.0.0: 1358 | version "3.1.0" 1359 | resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" 1360 | dependencies: 1361 | pinkie-promise "^2.0.0" 1362 | readable-stream "^2.0.0" 1363 | 1364 | read-chunk@^1.0.0: 1365 | version "1.0.1" 1366 | resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-1.0.1.tgz#5f68cab307e663f19993527d9b589cace4661194" 1367 | 1368 | read-pkg-up@^1.0.1: 1369 | version "1.0.1" 1370 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 1371 | dependencies: 1372 | find-up "^1.0.0" 1373 | read-pkg "^1.0.0" 1374 | 1375 | read-pkg@^1.0.0: 1376 | version "1.1.0" 1377 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 1378 | dependencies: 1379 | load-json-file "^1.0.0" 1380 | normalize-package-data "^2.3.2" 1381 | path-type "^1.0.0" 1382 | 1383 | readable-stream@1.1: 1384 | version "1.1.13" 1385 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" 1386 | dependencies: 1387 | core-util-is "~1.0.0" 1388 | inherits "~2.0.1" 1389 | isarray "0.0.1" 1390 | string_decoder "~0.10.x" 1391 | 1392 | readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.5: 1393 | version "2.2.2" 1394 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" 1395 | dependencies: 1396 | buffer-shims "^1.0.0" 1397 | core-util-is "~1.0.0" 1398 | inherits "~2.0.1" 1399 | isarray "~1.0.0" 1400 | process-nextick-args "~1.0.6" 1401 | string_decoder "~0.10.x" 1402 | util-deprecate "~1.0.1" 1403 | 1404 | readable-stream@~2.0.0: 1405 | version "2.0.6" 1406 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" 1407 | dependencies: 1408 | core-util-is "~1.0.0" 1409 | inherits "~2.0.1" 1410 | isarray "~1.0.0" 1411 | process-nextick-args "~1.0.6" 1412 | string_decoder "~0.10.x" 1413 | util-deprecate "~1.0.1" 1414 | 1415 | readline2@^1.0.1: 1416 | version "1.0.1" 1417 | resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" 1418 | dependencies: 1419 | code-point-at "^1.0.0" 1420 | is-fullwidth-code-point "^1.0.0" 1421 | mute-stream "0.0.5" 1422 | 1423 | rechoir@^0.6.2: 1424 | version "0.6.2" 1425 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" 1426 | dependencies: 1427 | resolve "^1.1.6" 1428 | 1429 | redent@^1.0.0: 1430 | version "1.0.0" 1431 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 1432 | dependencies: 1433 | indent-string "^2.1.0" 1434 | strip-indent "^1.0.1" 1435 | 1436 | repeating@^2.0.0: 1437 | version "2.0.1" 1438 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1439 | dependencies: 1440 | is-finite "^1.0.0" 1441 | 1442 | replace-ext@0.0.1: 1443 | version "0.0.1" 1444 | resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" 1445 | 1446 | require-uncached@^1.0.2: 1447 | version "1.0.3" 1448 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 1449 | dependencies: 1450 | caller-path "^0.1.0" 1451 | resolve-from "^1.0.0" 1452 | 1453 | resolve-from@^1.0.0: 1454 | version "1.0.1" 1455 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 1456 | 1457 | resolve@^1.1.6: 1458 | version "1.2.0" 1459 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c" 1460 | 1461 | restore-cursor@^1.0.1: 1462 | version "1.0.1" 1463 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" 1464 | dependencies: 1465 | exit-hook "^1.0.0" 1466 | onetime "^1.0.0" 1467 | 1468 | rimraf@^2.2.0, rimraf@^2.2.8, rimraf@^2.4.4: 1469 | version "2.5.4" 1470 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" 1471 | dependencies: 1472 | glob "^7.0.5" 1473 | 1474 | run-async@^0.1.0: 1475 | version "0.1.0" 1476 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" 1477 | dependencies: 1478 | once "^1.3.0" 1479 | 1480 | run-async@^2.0.0, run-async@^2.2.0: 1481 | version "2.3.0" 1482 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 1483 | dependencies: 1484 | is-promise "^2.1.0" 1485 | 1486 | rx-lite@^3.1.2: 1487 | version "3.1.2" 1488 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" 1489 | 1490 | rx@^4.1.0: 1491 | version "4.1.0" 1492 | resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" 1493 | 1494 | samsam@1.1.2, samsam@~1.1: 1495 | version "1.1.2" 1496 | resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" 1497 | 1498 | "semver@2 || 3 || 4 || 5": 1499 | version "5.3.0" 1500 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1501 | 1502 | shelljs@^0.6.0: 1503 | version "0.6.1" 1504 | resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" 1505 | 1506 | shelljs@^0.7.0: 1507 | version "0.7.5" 1508 | resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.5.tgz#2eef7a50a21e1ccf37da00df767ec69e30ad0675" 1509 | dependencies: 1510 | glob "^7.0.0" 1511 | interpret "^1.0.0" 1512 | rechoir "^0.6.2" 1513 | 1514 | signal-exit@^3.0.0: 1515 | version "3.0.2" 1516 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1517 | 1518 | sinon@^1.17.2: 1519 | version "1.17.6" 1520 | resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.6.tgz#a43116db59577c8296356afee13fafc2332e58e1" 1521 | dependencies: 1522 | formatio "1.1.1" 1523 | lolex "1.3.2" 1524 | samsam "1.1.2" 1525 | util ">=0.10.3 <1" 1526 | 1527 | slice-ansi@0.0.4: 1528 | version "0.0.4" 1529 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 1530 | 1531 | source-map@~0.2.0: 1532 | version "0.2.0" 1533 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" 1534 | dependencies: 1535 | amdefine ">=0.0.4" 1536 | 1537 | spawn-sync@^1.0.15: 1538 | version "1.0.15" 1539 | resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" 1540 | dependencies: 1541 | concat-stream "^1.4.7" 1542 | os-shim "^0.1.2" 1543 | 1544 | spdx-correct@~1.0.0: 1545 | version "1.0.2" 1546 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 1547 | dependencies: 1548 | spdx-license-ids "^1.0.2" 1549 | 1550 | spdx-expression-parse@~1.0.0: 1551 | version "1.0.4" 1552 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 1553 | 1554 | spdx-license-ids@^1.0.2: 1555 | version "1.2.2" 1556 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 1557 | 1558 | sprintf-js@^1.0.3, sprintf-js@~1.0.2: 1559 | version "1.0.3" 1560 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1561 | 1562 | string-template@~0.2.1: 1563 | version "0.2.1" 1564 | resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" 1565 | 1566 | string-width@^1.0.0, string-width@^1.0.1: 1567 | version "1.0.2" 1568 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1569 | dependencies: 1570 | code-point-at "^1.0.0" 1571 | is-fullwidth-code-point "^1.0.0" 1572 | strip-ansi "^3.0.0" 1573 | 1574 | string-width@^2.0.0: 1575 | version "2.0.0" 1576 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" 1577 | dependencies: 1578 | is-fullwidth-code-point "^2.0.0" 1579 | strip-ansi "^3.0.0" 1580 | 1581 | string_decoder@~0.10.x: 1582 | version "0.10.31" 1583 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1584 | 1585 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1586 | version "3.0.1" 1587 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1588 | dependencies: 1589 | ansi-regex "^2.0.0" 1590 | 1591 | strip-bom-stream@^2.0.0: 1592 | version "2.0.0" 1593 | resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca" 1594 | dependencies: 1595 | first-chunk-stream "^2.0.0" 1596 | strip-bom "^2.0.0" 1597 | 1598 | strip-bom@^2.0.0: 1599 | version "2.0.0" 1600 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 1601 | dependencies: 1602 | is-utf8 "^0.2.0" 1603 | 1604 | strip-bom@^3.0.0: 1605 | version "3.0.0" 1606 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1607 | 1608 | strip-indent@^1.0.1: 1609 | version "1.0.1" 1610 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 1611 | dependencies: 1612 | get-stdin "^4.0.1" 1613 | 1614 | strip-json-comments@~1.0.1: 1615 | version "1.0.4" 1616 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" 1617 | 1618 | supports-color@3.1.2: 1619 | version "3.1.2" 1620 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" 1621 | dependencies: 1622 | has-flag "^1.0.0" 1623 | 1624 | supports-color@^2.0.0: 1625 | version "2.0.0" 1626 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1627 | 1628 | table@^3.7.8: 1629 | version "3.8.3" 1630 | resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" 1631 | dependencies: 1632 | ajv "^4.7.0" 1633 | ajv-keywords "^1.0.0" 1634 | chalk "^1.1.1" 1635 | lodash "^4.0.0" 1636 | slice-ansi "0.0.4" 1637 | string-width "^2.0.0" 1638 | 1639 | taketalk@^1.0.0: 1640 | version "1.0.0" 1641 | resolved "https://registry.yarnpkg.com/taketalk/-/taketalk-1.0.0.tgz#b4d4f0deed206ae7df775b129ea2ca6de52f26dd" 1642 | dependencies: 1643 | get-stdin "^4.0.1" 1644 | minimist "^1.1.0" 1645 | 1646 | text-table@^0.2.0, text-table@~0.2.0: 1647 | version "0.2.0" 1648 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1649 | 1650 | "textextensions@1 || 2": 1651 | version "2.0.1" 1652 | resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.0.1.tgz#be8cf22d65379c151319f88f0335ad8f667abdca" 1653 | 1654 | through2@^2.0.0: 1655 | version "2.0.3" 1656 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 1657 | dependencies: 1658 | readable-stream "^2.1.5" 1659 | xtend "~4.0.1" 1660 | 1661 | through@^2.3.6: 1662 | version "2.3.8" 1663 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1664 | 1665 | timed-out@^3.0.0: 1666 | version "3.1.0" 1667 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.0.tgz#43b98b14bb712c9161c28f4dc1f3068d67a04ec2" 1668 | 1669 | tmp@^0.0.29: 1670 | version "0.0.29" 1671 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" 1672 | dependencies: 1673 | os-tmpdir "~1.0.1" 1674 | 1675 | traverse@^0.6.6: 1676 | version "0.6.6" 1677 | resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" 1678 | 1679 | trim-newlines@^1.0.0: 1680 | version "1.0.0" 1681 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 1682 | 1683 | tryit@^1.0.1: 1684 | version "1.0.3" 1685 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 1686 | 1687 | type-check@~0.3.2: 1688 | version "0.3.2" 1689 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1690 | dependencies: 1691 | prelude-ls "~1.1.2" 1692 | 1693 | typedarray@~0.0.5: 1694 | version "0.0.6" 1695 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1696 | 1697 | underscore.string@^3.0.3, underscore.string@^3.3.4: 1698 | version "3.3.4" 1699 | resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" 1700 | dependencies: 1701 | sprintf-js "^1.0.3" 1702 | util-deprecate "^1.0.2" 1703 | 1704 | untildify@^2.0.0: 1705 | version "2.1.0" 1706 | resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0" 1707 | dependencies: 1708 | os-homedir "^1.0.0" 1709 | 1710 | unzip-response@^1.0.2: 1711 | version "1.0.2" 1712 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" 1713 | 1714 | url-parse-lax@^1.0.0: 1715 | version "1.0.0" 1716 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 1717 | dependencies: 1718 | prepend-http "^1.0.1" 1719 | 1720 | user-home@^2.0.0: 1721 | version "2.0.0" 1722 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" 1723 | dependencies: 1724 | os-homedir "^1.0.0" 1725 | 1726 | util-deprecate@^1.0.2, util-deprecate@~1.0.1: 1727 | version "1.0.2" 1728 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1729 | 1730 | "util@>=0.10.3 <1": 1731 | version "0.10.3" 1732 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" 1733 | dependencies: 1734 | inherits "2.0.1" 1735 | 1736 | validate-npm-package-license@^3.0.1: 1737 | version "3.0.1" 1738 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 1739 | dependencies: 1740 | spdx-correct "~1.0.0" 1741 | spdx-expression-parse "~1.0.0" 1742 | 1743 | vinyl-file@^2.0.0: 1744 | version "2.0.0" 1745 | resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-2.0.0.tgz#a7ebf5ffbefda1b7d18d140fcb07b223efb6751a" 1746 | dependencies: 1747 | graceful-fs "^4.1.2" 1748 | pify "^2.3.0" 1749 | pinkie-promise "^2.0.0" 1750 | strip-bom "^2.0.0" 1751 | strip-bom-stream "^2.0.0" 1752 | vinyl "^1.1.0" 1753 | 1754 | vinyl@^1.1.0: 1755 | version "1.2.0" 1756 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" 1757 | dependencies: 1758 | clone "^1.0.0" 1759 | clone-stats "^0.0.1" 1760 | replace-ext "0.0.1" 1761 | 1762 | which@^1.2.9: 1763 | version "1.2.12" 1764 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" 1765 | dependencies: 1766 | isexe "^1.1.1" 1767 | 1768 | wordwrap@~1.0.0: 1769 | version "1.0.0" 1770 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1771 | 1772 | wrap-ansi@^2.0.0: 1773 | version "2.1.0" 1774 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 1775 | dependencies: 1776 | string-width "^1.0.1" 1777 | strip-ansi "^3.0.1" 1778 | 1779 | wrappy@1: 1780 | version "1.0.2" 1781 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1782 | 1783 | write@^0.2.1: 1784 | version "0.2.1" 1785 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 1786 | dependencies: 1787 | mkdirp "^0.5.1" 1788 | 1789 | xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: 1790 | version "4.0.1" 1791 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1792 | 1793 | yallist@^2.0.0: 1794 | version "2.0.0" 1795 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" 1796 | 1797 | yeoman-assert@^2.0.0, yeoman-assert@^2.2.1: 1798 | version "2.2.2" 1799 | resolved "https://registry.yarnpkg.com/yeoman-assert/-/yeoman-assert-2.2.2.tgz#d2b15982f6a438a0d2319d8b5c1d65abc5b6dbea" 1800 | dependencies: 1801 | lodash "^3.6.0" 1802 | path-exists "^2.1.0" 1803 | 1804 | yeoman-environment@^1.1.0, yeoman-environment@^1.5.2: 1805 | version "1.6.6" 1806 | resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-1.6.6.tgz#cd85fa67d156060e440d7807d7ef7cf0d2d1d671" 1807 | dependencies: 1808 | chalk "^1.0.0" 1809 | debug "^2.0.0" 1810 | diff "^2.1.2" 1811 | escape-string-regexp "^1.0.2" 1812 | globby "^4.0.0" 1813 | grouped-queue "^0.3.0" 1814 | inquirer "^1.0.2" 1815 | lodash "^4.11.1" 1816 | log-symbols "^1.0.1" 1817 | mem-fs "^1.1.0" 1818 | text-table "^0.2.0" 1819 | untildify "^2.0.0" 1820 | 1821 | yeoman-generator@^0.24.1: 1822 | version "0.24.1" 1823 | resolved "https://registry.yarnpkg.com/yeoman-generator/-/yeoman-generator-0.24.1.tgz#1ca74429d9c5c95db0b22859ec180a2599bc1f8e" 1824 | dependencies: 1825 | async "^2.0.0" 1826 | chalk "^1.0.0" 1827 | class-extend "^0.1.0" 1828 | cli-table "^0.3.1" 1829 | cross-spawn "^4.0.0" 1830 | dargs "^4.0.0" 1831 | dateformat "^1.0.11" 1832 | debug "^2.1.0" 1833 | detect-conflict "^1.0.0" 1834 | error "^7.0.2" 1835 | find-up "^1.0.0" 1836 | github-username "^2.0.0" 1837 | glob "^7.0.3" 1838 | gruntfile-editor "^1.0.0" 1839 | html-wiring "^1.0.0" 1840 | istextorbinary "^2.1.0" 1841 | lodash "^4.11.1" 1842 | mem-fs-editor "^2.0.0" 1843 | mkdirp "^0.5.0" 1844 | nopt "^3.0.0" 1845 | path-exists "^2.0.0" 1846 | path-is-absolute "^1.0.0" 1847 | pretty-bytes "^3.0.1" 1848 | read-chunk "^1.0.0" 1849 | read-pkg-up "^1.0.1" 1850 | rimraf "^2.2.0" 1851 | run-async "^2.0.0" 1852 | shelljs "^0.7.0" 1853 | text-table "^0.2.0" 1854 | through2 "^2.0.0" 1855 | underscore.string "^3.0.3" 1856 | user-home "^2.0.0" 1857 | yeoman-assert "^2.0.0" 1858 | yeoman-environment "^1.1.0" 1859 | yeoman-test "^1.0.0" 1860 | yeoman-welcome "^1.0.0" 1861 | 1862 | yeoman-test@^1.0.0, yeoman-test@^1.5.1: 1863 | version "1.6.0" 1864 | resolved "https://registry.yarnpkg.com/yeoman-test/-/yeoman-test-1.6.0.tgz#abff291733e16e8923d9eefc8691c632888bf948" 1865 | dependencies: 1866 | inquirer "^1.0.2" 1867 | lodash "^4.3.0" 1868 | mkdirp "^0.5.1" 1869 | pinkie-promise "^2.0.1" 1870 | rimraf "^2.4.4" 1871 | sinon "^1.17.2" 1872 | yeoman-environment "^1.5.2" 1873 | yeoman-generator "^0.24.1" 1874 | 1875 | yeoman-welcome@^1.0.0: 1876 | version "1.0.1" 1877 | resolved "https://registry.yarnpkg.com/yeoman-welcome/-/yeoman-welcome-1.0.1.tgz#f6cf198fd4fba8a771672c26cdfb8a64795c84ec" 1878 | dependencies: 1879 | chalk "^1.0.0" 1880 | 1881 | yosay@^1.2.0: 1882 | version "1.2.1" 1883 | resolved "https://registry.yarnpkg.com/yosay/-/yosay-1.2.1.tgz#9466ef969830e85b474e267b50f7688693ed3b5b" 1884 | dependencies: 1885 | ansi-regex "^2.0.0" 1886 | ansi-styles "^2.0.0" 1887 | chalk "^1.0.0" 1888 | cli-boxes "^1.0.0" 1889 | pad-component "0.0.1" 1890 | repeating "^2.0.0" 1891 | string-width "^1.0.0" 1892 | strip-ansi "^3.0.0" 1893 | taketalk "^1.0.0" 1894 | wrap-ansi "^2.0.0" 1895 | --------------------------------------------------------------------------------