diff --git a/README.md b/README.md index 118d59b..829345b 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ -# generator-ngbp +# generator-ngbp-material -> Yeoman Generator based on the popular ngBoilerplate AngularJS kickstarter. ngBoilerplate is a best-practice boilerplate for scalable Angular projects built on a highly modular, folder-by-feature structure. You work in vertical slices on a daily basis (view, controller, service, etc), so why not organize your projects to optimize your workflow, maximize discoverability, and get copy-paste module reuse for free? +> Yeoman Generator based on angular-material and the popular ngBoilerplate AngularJS kickstarter. ngBoilerplate is a best-practice boilerplate for scalable Angular projects built on a highly modular, folder-by-feature structure. You work in vertical slices on a daily basis (view, controller, service, etc), so why not organize your projects to optimize your workflow, maximize discoverability, and get copy-paste module reuse for free? ## Quick Start Install generator-ngbp from npm, run: ``` -$ npm install -g generator-ngbp +$ npm install -g generator-ngbp-angular ``` Create a new directory for your project and cd into it: @@ -20,7 +20,7 @@ $ cd my-new-project Initiate the generator: ``` -$ yo ngbp +$ yo ngbp-material ``` ### Sub-Generators @@ -31,7 +31,7 @@ There's only one subgenerator at the moment To create a new module... ``` -$ yo ngbp:module "moduleName" +$ yo ngbp-material:module "moduleName" ``` You can specify the root folder of the module via prompt - default is "app". diff --git a/app/index.js b/app/index.js index e3a49ca..85dbc1f 100644 --- a/app/index.js +++ b/app/index.js @@ -5,7 +5,7 @@ var yeoman = require('yeoman-generator'); var chalk = require('chalk'); -var NgbpGenerator = yeoman.generators.Base.extend({ +var NgbpMaterialGenerator = yeoman.generators.Base.extend({ init: function () { this.pkg = require('../package.json'); @@ -25,11 +25,11 @@ var NgbpGenerator = yeoman.generators.Base.extend({ //this.spawnCommand('grunt', ['build']); this.log(chalk.green( '\nYou\'re good to go!!!!\n' + - 'Simply running ') + chalk.cyan.bold("grunt watch") + chalk.green(' will do the following:\n' + + 'Simply running ') + chalk.cyan.bold("gulp") + chalk.green(' will do the following:\n' + ' - Build everything (concat, create js templates of html, etc) and place it into a "build" folder\n' + ' - Run all your tests\n' + ' - Watch your files for changes to do the above without any intervention\n' + - ' - Launch express server to host your app at http://localhost:9000/index.html\n' + + ' - Launch express server to host your app at http://localhost:8080/index.html\n' + ' - Setup LiveReload so you immediately see changes in your browser (you still have to enable LiveReload on your browser)\n')); }); }, @@ -57,12 +57,6 @@ var NgbpGenerator = yeoman.generators.Base.extend({ type: 'confirm', name: 'useCoffeescript', message: 'Would you like to use Coffeescript?', - default: false - }, - { - type: 'confirm', - name: 'includeAngularResource', - message: 'Do you want to include angular-resource, helpful for calling RESTful apis?', default: true }, ]; @@ -71,7 +65,6 @@ var NgbpGenerator = yeoman.generators.Base.extend({ this.projectName = props.projectName; this.author = props.author; this.useCoffeescript = props.useCoffeescript; - this.includeAngularResource = props.includeAngularResource; done(); }.bind(this)); @@ -121,4 +114,4 @@ var NgbpGenerator = yeoman.generators.Base.extend({ }); -module.exports = NgbpGenerator; \ No newline at end of file +module.exports = NgbpMaterialGenerator; diff --git a/app/templates/root/_Gruntfile.js b/app/templates/root/_Gruntfile.js deleted file mode 100644 index d229a58..0000000 --- a/app/templates/root/_Gruntfile.js +++ /dev/null @@ -1,660 +0,0 @@ -module.exports = function(grunt) { - - var _ = require('lodash'); - - // Load required Grunt tasks. These are installed based on the versions listed - // * in 'package.json' when you do 'npm install' in this directory. - grunt.loadNpmTasks('grunt-contrib-clean'); - grunt.loadNpmTasks('grunt-contrib-copy'); - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-contrib-concat'); - grunt.loadNpmTasks('grunt-contrib-watch'); - grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-contrib-coffee'); - grunt.loadNpmTasks('grunt-contrib-less'); - grunt.loadNpmTasks('grunt-coffeelint'); - grunt.loadNpmTasks('grunt-karma'); - grunt.loadNpmTasks('grunt-ng-annotate'); - grunt.loadNpmTasks('grunt-html2js'); - grunt.loadNpmTasks('grunt-express'); - - /** ********************************************************************************* */ - /** **************************** File Config **************************************** */ - var fileConfig = { - build_dir: 'build', - compile_dir: 'bin', - - /** - * This is a collection of file patterns for our app code (the - * stuff in 'src/'). These paths are used in the configuration of - * build tasks. 'js' is all project javascript, except tests. - * 'commonTemplates' contains our reusable components' ('src/common') - * template HTML files, while 'appTemplates' contains the templates for - * our app's code. 'html' is just our main HTML file. 'less' is our main - * stylesheet, and 'unit' contains our app's unit tests. - */ - app_files: { - js: [ 'src/**/*.js', '!src/**/*.spec.js', '!src/assets/**/*.js' ], - jsunit: [ 'src/**/*.spec.js' ], - - coffee: [ 'src/**/*.coffee', '!src/**/*.spec.coffee' ], - coffeeunit: [ 'src/**/*.spec.coffee' ], - - appTemplates: [ 'src/app/**/*.tpl.html' ], - commonTemplates: [ 'src/common/**/*.tpl.html' ], - - html: [ 'src/index.html' ], - less: 'src/less/main.less' - }, - - /** - * This is a collection of files used during testing only. - */ - test_files: { - js: [ - 'vendor/angular-mocks/angular-mocks.js' - ] - }, - - /** - * This is the same as 'app_files', except it contains patterns that - * reference vendor code ('vendor/') that we need to place into the build - * process somewhere. While the 'app_files' property ensures all - * standardized files are collected for compilation, it is the user's job - * to ensure non-standardized (i.e. vendor-related) files are handled - * appropriately in 'vendor_files.js'. - * - * The 'vendor_files.js' property holds files to be automatically - * concatenated and minified with our project source files. - * - * The 'vendor_files.css' property holds any CSS files to be automatically - * included in our app. - * - * The 'vendor_files.assets' property holds any assets to be copied along - * with our app's assets. This structure is flattened, so it is not - * recommended that you use wildcards. - */ - vendor_files: { - js: [ - 'vendor/angular/angular.js', - <% if (includeAngularResource) {%>'vendor/angular-resource/angular-resource.js',<% } %> - 'vendor/angular-bootstrap/ui-bootstrap-tpls.min.js', - 'vendor/placeholders/angular-placeholders-0.0.1-SNAPSHOT.min.js', - 'vendor/angular-ui-router/release/angular-ui-router.js', - 'vendor/angular-ui-utils/modules/route/route.js' - ], - css: [ - ], - assets: [ - ] - } - }; - - /** ********************************************************************************* */ - /** **************************** Task Config **************************************** */ - var taskConfig = { - pkg: grunt.file.readJSON("package.json"), - - /** - * The banner is the comment that is placed at the top of our compiled - * source files. It is first processed as a Grunt template, where the '<%=' - * pairs are evaluated based on this very configuration object. - */ - meta: { - banner: - '/**\n' + - ' * <%%= pkg.name %> - v<%%= pkg.version %> - <%%= grunt.template.today("yyyy-mm-dd") %>\n' + - ' *\n' + - ' * Copyright (c) <%%= grunt.template.today("yyyy") %> <%%= pkg.author %>\n' + - ' */\n' - }, - - /** - * The directories to delete when 'grunt clean' is executed. - */ - clean: [ - '<%%= build_dir %>', - '<%%= compile_dir %>' - ], - - /** - * The 'copy' task just copies files from A to B. We use it here to copy - * our project assets (images, fonts, etc.) and javascripts into - * 'build_dir', and then to copy the assets to 'compile_dir'. - */ - copy: { - build_app_assets: { - files: [ - { - src: [ '**' ], - dest: '<%%= build_dir %>/assets/', - cwd: 'src/assets', - expand: true - } - ] - }, - build_vendor_assets: { - files: [ - { - src: [ '<%%= vendor_files.assets %>' ], - dest: '<%%= build_dir %>/assets/', - cwd: '.', - expand: true, - flatten: true - } - ] - }, - build_appjs: { - files: [ - { - src: [ '<%%= app_files.js %>' ], - dest: '<%%= build_dir %>/', - cwd: '.', - expand: true - } - ] - }, - build_vendorjs: { - files: [ - { - src: [ '<%%= vendor_files.js %>' ], - dest: '<%%= build_dir %>/', - cwd: '.', - expand: true - } - ] - }, - compile_assets: { - files: [ - { - src: [ '**' ], - dest: '<%%= compile_dir %>/assets', - cwd: '<%%= build_dir %>/assets', - expand: true - } - ] - } - }, - - /** - * 'grunt concat' concatenates multiple source files into a single file. - */ - concat: { - // The 'build_css' target concatenates compiled CSS and vendor CSS together. - build_css: { - src: [ - '<%%= vendor_files.css %>', - '<%%= build_dir %>/assets/<%%= pkg.name %>-<%%= pkg.version %>.css' - ], - dest: '<%%= build_dir %>/assets/<%%= pkg.name %>-<%%= pkg.version %>.css' - }, - // The 'compile_js' target concatenates app and vendor js code together. - compile_js: { - options: { - banner: '<%%= meta.banner %>' - }, - src: [ - '<%%= vendor_files.js %>', - 'module.prefix', - '<%%= build_dir %>/src/**/*.js', - '<%%= html2js.app.dest %>', - '<%%= html2js.common.dest %>', - 'module.suffix' - ], - dest: '<%%= compile_dir %>/assets/<%%= pkg.name %>-<%%= pkg.version %>.js' - } - }, - - /** - * 'grunt coffee' compiles the CoffeeScript sources. To work well with the - * rest of the build, we have a separate compilation task for sources and - * specs so they can go to different places. For example, we need the - * sources to live with the rest of the copied JavaScript so we can include - * it in the final build, but we don't want to include our specs there. - */ - coffee: { - source: { - options: { - bare: true - }, - expand: true, - cwd: '.', - src: [ '<%%= app_files.coffee %>' ], - dest: '<%%= build_dir %>', - ext: '.js' - } - }, - - /** - * 'ng-annotate' annotates the sources for safe minification. That is, it allows us - * to code without the array syntax. - */ - ngAnnotate: { - options: { - singleQuotes: true - }, - build: { - files:[ - { - src: [ '<%%= app_files.js %>' ], - cwd: '<%%= build_dir %>', - dest: '<%%= build_dir %>', - expand: true - }, - ] - }, - }, - - /** - * Minify the sources! - */ - uglify: { - compile: { - options: { - banner: '<%%= meta.banner %>' - }, - files: { - '<%%= concat.compile_js.dest %>': '<%%= concat.compile_js.dest %>' - } - } - }, - - /** - * `grunt-contrib-less` handles our LESS compilation and uglification automatically. - * Only our 'main.less' file is included in compilation; all other files - * must be imported from this file. - */ - less: { - build: { - files: { - '<%%= build_dir %>/assets/<%%= pkg.name %>-<%%= pkg.version %>.css': '<%%= app_files.less %>' - } - }, - compile: { - files: { - '<%%= build_dir %>/assets/<%%= pkg.name %>-<%%= pkg.version %>.css': '<%%= app_files.less %>' - }, - options: { - cleancss: true, - compress: true - } - } - }, - - /** - * 'jshint' defines the rules of our linter as well as which files we - * should check. This file, all javascript sources, and all our unit tests - * are linted based on the policies listed in 'options'. But we can also - * specify exclusionary patterns by prefixing them with an exclamation - * point (!); this is useful when code comes from a third party but is - * nonetheless inside 'src/'. - */ - jshint: { - src: [ - '<%%= app_files.js %>' - ], - test: [ - '<%%= app_files.jsunit %>' - ], - gruntfile: [ - 'Gruntfile.js' - ], - options: { - curly: true, - immed: true, - newcap: true, - noarg: true, - sub: true, - boss: true, - eqnull: true - }, - globals: {} - }, - - /** - * 'coffeelint' does the same as 'jshint', but for CoffeeScript. - * CoffeeScript is not the default in ngBoilerplate, so we're just using - * the defaults here. - */ - coffeelint: { - src: { - files: { - src: [ '<%%= app_files.coffee %>' ] - } - }, - test: { - files: { - src: [ '<%%= app_files.coffeeunit %>' ] - } - } - }, - - /** - * HTML2JS is a Grunt plugin that takes all of your template files and - * places them into JavaScript files as strings that are added to - * AngularJS's template cache. This means that the templates too become - * part of the initial payload as one JavaScript file. Neat! - */ - html2js: { - // These are the templates from 'src/app'. - app: { - options: { - base: 'src/app' - }, - src: [ '<%%= app_files.appTemplates %>' ], - dest: '<%%= build_dir %>/templates-app.js' - }, - - // These are the templates from 'src/common'. - common: { - options: { - base: 'src/common' - }, - src: [ '<%%= app_files.commonTemplates %>' ], - dest: '<%%= build_dir %>/templates-common.js' - } - }, - - /** - * The 'index' task compiles the 'index.html' file as a Grunt template. CSS - * and JS files co-exist here but they get split apart later. - */ - index: { - - /** - * During development, we don't want to have wait for compilation, - * concatenation, minification, etc. So to avoid these steps, we simply - * add all script files directly to the '' of 'index.html'. The - * 'src' property contains the list of included files. - */ - build: { - dir: '<%%= build_dir %>', - src: [ - '<%%= vendor_files.js %>', - '<%%= build_dir %>/src/**/*.js', - '<%%= html2js.common.dest %>', - '<%%= html2js.app.dest %>', - '<%%= vendor_files.css %>', - '<%%= build_dir %>/assets/<%%= pkg.name %>-<%%= pkg.version %>.css' - ] - }, - - /** - * When it is time to have a completely compiled application, we can - * alter the above to include only a single JavaScript and a single CSS - * file. Now we're back! - */ - compile: { - dir: '<%%= compile_dir %>', - src: [ - '<%%= concat.compile_js.dest %>', - '<%%= vendor_files.css %>', - '<%%= build_dir %>/assets/<%%= pkg.name %>-<%%= pkg.version %>.css' - ] - } - }, - - express: { - devServer: { - options: { - port: 9000, - hostname: 'localhost', - serverreload: false, - bases: 'build', - livereload: true - } - } - }, - - /** - * The Karma configurations. - */ - karma: { - options: { - configFile: '<%%= build_dir %>/karma-unit.js' - }, - unit: { - runnerPort: 9019, - background: true - }, - continuous: { - singleRun: true - } - }, - - /** - * This task compiles the karma template so that changes to its file array - * don't have to be managed manually. - */ - karmaconfig: { - unit: { - dir: '<%%= build_dir %>', - src: [ - '<%%= vendor_files.js %>', - '<%%= html2js.app.dest %>', - '<%%= html2js.common.dest %>', - '<%%= test_files.js %>' - ] - } - }, - - /** - * And for rapid development, we have a watch set up that checks to see if - * any of the files listed below change, and then to execute the listed - * tasks when they do. This just saves us from having to type "grunt" into - * the command-line every time we want to see what we're working on; we can - * instead just leave "grunt watch" running in a background terminal. Set it - * and forget it, as Ron Popeil used to tell us. - * - * But we don't need the same thing to happen for all the files. - */ - delta: { - /** - * By default, we want the Live Reload to work for all tasks; this is - * overridden in some tasks (like this file) where browser resources are - * unaffected. It runs by default on port 35729, which your browser - * plugin should auto-detect. - */ - options: { - livereload: true - }, - - /** - * When the Gruntfile changes, we just want to lint it. In fact, when - * your Gruntfile changes, it will automatically be reloaded! - */ - gruntfile: { - files: 'Gruntfile.js', - tasks: [ 'jshint:gruntfile' ], - options: { - livereload: false - } - }, - - /** - * When our JavaScript source files change, we want to run lint them and - * run our unit tests. - */ - jssrc: { - files: [ - '<%%= app_files.js %>' - ], - tasks: [ 'jshint:src', 'karma:unit:run', 'copy:build_appjs', 'index:build' ] - }, - - /** - * When our CoffeeScript source files change, we want to run lint them and - * run our unit tests. - */ - coffeesrc: { - files: [ - '<%%= app_files.coffee %>' - ], - tasks: [ 'coffeelint:src', 'coffee:source', 'karma:unit:run', 'copy:build_appjs' ] - }, - - /** - * When assets are changed, copy them. Note that this will *not* copy new - * files, so this is probably not very useful. - */ - assets: { - files: [ - 'src/assets/**/*' - ], - tasks: [ 'copy:build_app_assets' ] - }, - - /** - * When index.html changes, we need to compile it. - */ - html: { - files: [ '<%%= app_files.html %>' ], - tasks: [ 'index:build' ] - }, - - /** - * When our templates change, we only rewrite the template cache. - */ - tpls: { - files: [ - '<%%= app_files.appTemplates %>', - '<%%= app_files.commonTemplates %>' - ], - tasks: [ 'html2js' ] - }, - - /** - * When the CSS files change, we need to compile and minify them. - */ - less: { - files: [ 'src/**/*.less' ], - tasks: [ 'less:build' ] - }, - - /** - * When a JavaScript unit test file changes, we only want to lint it and - * run the unit tests. We don't want to do any live reloading. - */ - jsunit: { - files: [ - '<%%= app_files.jsunit %>' - ], - tasks: [ 'jshint:test', 'karma:unit:run' ], - options: { - livereload: false - } - }, - - /** - * When a CoffeeScript unit test file changes, we only want to lint it and - * run the unit tests. We don't want to do any live reloading. - */ - coffeeunit: { - files: [ - '<%%= app_files.coffeeunit %>' - ], - tasks: [ 'coffeelint:test', 'karma:unit:run' ], - options: { - livereload: false - } - } - } - }; - - - /** ********************************************************************************* */ - /** **************************** Project Configuration ****************************** */ - grunt.initConfig(_.extend(taskConfig, fileConfig)); - - // In order to make it safe to just compile or copy *only* what was changed, - // we need to ensure we are starting from a clean, fresh build. So we rename - // the 'watch' task to 'delta' (that's why the configuration var above is - // 'delta') and then add a new task called 'watch' that does a clean build - // before watching for changes. - grunt.renameTask('watch', 'delta'); - grunt.registerTask('watch', [ 'build', 'karma:unit', 'express', 'delta' ]); - - // The default task is to build and compile. - grunt.registerTask('default', [ 'build', 'compile' ]); - - // The 'build' task gets your app ready to run for development and testing. - grunt.registerTask('build', [ - 'clean', 'html2js', 'jshint', 'coffeelint', 'coffee', 'less:build', - 'concat:build_css', 'copy:build_app_assets', 'copy:build_vendor_assets', - 'copy:build_appjs', 'copy:build_vendorjs', 'ngAnnotate:build', 'index:build', 'karmaconfig', - 'karma:continuous' - ]); - - // The 'compile' task gets your app ready for deployment by concatenating and minifying your code. - // Note - compile builds off of the build dir (look at concat:compile_js), so run grunt build before grunt compile - grunt.registerTask('compile', [ - 'less:compile', 'copy:compile_assets', 'concat:compile_js', 'uglify', 'index:compile' - ]); - - // A utility function to get all app JavaScript sources. - function filterForJS (files) { - return files.filter(function (file) { - return file.match(/\.js$/); - }); - } - - // A utility function to get all app CSS sources. - function filterForCSS (files) { - return files.filter( function (file) { - return file.match(/\.css$/); - }); - } - - // The index.html template includes the stylesheet and javascript sources - // based on dynamic names calculated in this Gruntfile. This task assembles - // the list into variables for the template to use and then runs the - // compilation. - grunt.registerMultiTask('index', 'Process index.html template', function () { - var dirRE = new RegExp('^(' + grunt.config('build_dir') + '|' + grunt.config('compile_dir') + ')\/', 'g'); - - // this.fileSrc comes from either build:src, compile:src, or karmaconfig:src in the index config defined above - // see - http://gruntjs.com/api/inside-tasks#this.filessrc for documentation - var jsFiles = filterForJS(this.filesSrc).map(function (file) { - return file.replace(dirRE, ''); - }); - var cssFiles = filterForCSS(this.filesSrc).map(function (file) { - return file.replace(dirRE, ''); - }); - - // this.data.dir comes from either build:dir, compile:dir, or karmaconfig:dir in the index config defined above - // see - http://gruntjs.com/api/inside-tasks#this.data for documentation - grunt.file.copy('src/index.html', this.data.dir + '/index.html', { - process: function (contents, path) { - // These are the variables looped over in our index.html exposed as "scripts", "styles", and "version" - return grunt.template.process(contents, { - data: { - scripts: jsFiles, - styles: cssFiles, - version: grunt.config('pkg.version'), - author: grunt.config('pkg.author'), - date: grunt.template.today("yyyy") - } - }); - } - }); - }); - - // In order to avoid having to specify manually the files needed for karma to - // run, we use grunt to manage the list for us. The 'karma/*' files are - // compiled as grunt templates for use by Karma. Yay! - grunt.registerMultiTask('karmaconfig', 'Process karma config templates', function () { - var jsFiles = filterForJS(this.filesSrc); - - grunt.file.copy('karma/karma-unit.tpl.js', grunt.config('build_dir') + '/karma-unit.js', { - process: function (contents, path) { - // This is the variable looped over in the karma template of our index.html exposed as "scripts" - return grunt.template.process(contents, { - data: { - scripts: jsFiles - } - }); - } - }); - }); - -}; diff --git a/app/templates/root/_bower.json b/app/templates/root/_bower.json index aa09f71..f9c22c8 100644 --- a/app/templates/root/_bower.json +++ b/app/templates/root/_bower.json @@ -4,12 +4,17 @@ "_comment": "Any dependencies added here require a manual edit to vendor_files in /Gruntfile.js and (??? verify the following) /build/karma-unit.js (e.g 'vendor/angular-resource/angular-resource.js')", "devDependencies": { "angular": "~1.2.9", - <% if (includeAngularResource) {%>"angular-resource": "~1.2.9",<% } %> - "angular-mocks": "~1.2.9", + "angular-mocks": "~1.3.11", "bootstrap": "~3.1", "angular-bootstrap": "~0.10.0", - "angular-ui-router": "~0.2.7" + "angular-material-source": "git@github.com:angular/material.git", + "angular-ui-router": "~0.2.7", + "angular-material" : "~0.7.0", + "restangular" : "~1.4.0" }, - "dependencies": {} + "dependencies": {}, + "resolutions": { + "angular": "1.3.11" + } } diff --git a/app/templates/root/_globs.coffee b/app/templates/root/_globs.coffee new file mode 100644 index 0000000..3d93c3e --- /dev/null +++ b/app/templates/root/_globs.coffee @@ -0,0 +1,68 @@ +globs = {} + +globs.coffee = 'src/**/*.coffee' +globs.jade = 'src/**/*.jade' +globs.src = 'src/**/*' +globs.build = 'build/**/*' +globs.html = 'build/**/*.html' +globs.app_js = 'build/app/**/*.js' +globs.app_sass = 'src/style/app.scss' +globs.app_css = 'build/style/main.css' +globs.vendor_js = 'build/vendor/**/*.js' +globs.vendor_css = 'build/vendor/**/*.css' +globs.vendor = 'vendor/**/*' + +# choose the angular material themes you want to use +# globs.themes = [ 'cyan', 'deep-purple', 'pink' ] + +globs.theme = 'vendor/angular-material-source/src/core/style/variables.scss' + +globs.sass = [ + # angular material core + 'vendor/angular-material-source/src/core/style/variables.scss' + 'vendor/angular-material-source/src/core/style/mixins.scss' + 'vendor/angular-material-source/src/core/style/structure.scss' + 'vendor/angular-material-source/src/core/style/layout.scss' + + # angular material components + 'vendor/angular-material-source/src/components/**/*.scss' + '!vendor/angular-material-source/src/components/**/*-theme.scss' + + # application style + 'src/**/*.scss' +] + +globs.themeSass = [ + 'vendor/angular-material-source/src/components/**/*-theme.scss' + 'src/core/style/variables.scss' + 'src/core/style/mixins.scss' +] + +globs.karma = [ + 'build/vendor/angular/angular.js' + 'build/vendor/angular-mocks/angular-mocks.js' + 'vendor/angular-ui-router/release/angular-ui-router.js' + globs.app_js +] + +globs.app = [ + # you need to reference bower modules here + 'vendor/jquery/dist/jquery.js', + 'vendor/angular/angular.js', + 'vendor/placeholders/angular-placeholders-0.0.1-SNAPSHOT.min.js', + 'vendor/hammerjs/hammer.min.js', + 'vendor/angular-ui-router/release/angular-ui-router.js', + 'vendor/angular-ui-utils/modules/route/route.js', + 'vendor/angular-animate/angular-animate.js', + 'vendor/angular-aria/angular-aria.js', + 'vendor/angular-material/angular-material.js', + 'vendor/angular-mocks/angular-mocks.js', + 'vendor/lodash/dist/lodash.js', + 'vendor/restangular/restangular.js' + + globs.app_js + "!build/app/**/*.spec.js" + globs.app_css +] + +module.exports = globs diff --git a/app/templates/root/_gulpfile.coffee b/app/templates/root/_gulpfile.coffee new file mode 100644 index 0000000..84c0b59 --- /dev/null +++ b/app/templates/root/_gulpfile.coffee @@ -0,0 +1,112 @@ +gulp = require 'gulp' +gutil = require 'gulp-util' +connect = require 'gulp-connect' +jade = require 'gulp-jade' +sass = require 'gulp-sass' +sourcemaps = require 'gulp-sourcemaps' +coffee = require 'gulp-coffee' +inject = require 'gulp-inject' +karma = require 'gulp-karma' +changed = require 'gulp-changed' +watch = require 'gulp-watch' +plumber = require 'gulp-plumber' +globs = require './globs' +series = require 'stream-series' +path = require('path') +filter = require('gulp-filter') +concat = require('gulp-concat') +rename = require('gulp-rename') +gulpif = require('gulp-if') + +# Paths +index_path = 'build/index.html' +src_dir = 'src/' +build_dir = 'build/' +build_vendor_dir = 'build/vendor/' + + +gulp.task 'connect', -> + connect.server + root : ['build'] + livereload : true + return + + +gulp.task 'move:jade', -> + gulp.src globs.jade + .pipe plumber() + .pipe jade({ pretty : true }) + .pipe inject(gulp.src(globs.app, { read : false }), { ignorePath : ['build'], addRootSlash : false }) + .pipe gulp.dest(build_dir) + + +gulp.task 'move:sass', -> + gulp.src globs.sass + .pipe plumber() + .pipe(concat('main.scss')) + .pipe(sourcemaps.init()) + .pipe(sass()) + .pipe(sourcemaps.write()) + .pipe(rename (path)-> + path.dirname = '/style' + path + ) + .pipe gulp.dest(build_dir) + +gulp.task 'move:coffee', -> + gulp.src globs.coffee + .pipe plumber() + .pipe coffee({ bare : true }) + .pipe gulp.dest(build_dir) + + +gulp.task 'move:vendor', -> + gulp.src globs.vendor + .pipe plumber() + .pipe gulp.dest(build_vendor_dir) + + +gulp.task 'run:karma', -> + gulp.src globs.karma + .pipe karma + configFile : 'karma.conf.js' + action : 'watch' + .on 'error', (err) -> + throw err + return + + +gulp.task 'watch', -> + gulp.watch globs.vendor, ['move:vendor'] + gulp.watch globs.jade, ['move:jade'] + gulp.watch globs.sass, ['move:sass'] + gulp.watch globs.coffee, ['move:coffee'] + gulp.watch globs.karma, ['run:karma'] + + +gulp.task 'move:files', ['move:vendor', 'move:sass', 'move:coffee'], -> + gulp.start 'move:jade' + +gulp.task 'default', ['move:files', 'connect', 'watch'] + +` +/** ***************************************** + * + * Internal helper functions + * + ** ***************************************** */ + + +function readModuleArg() { + var module = argv.c ? 'material.components.' + argv.c : (argv.module || argv.m); + if (!module) { + gutil.log('\nProvide a compnent argument via \`-c\`:', + '\nExample: -c toast'); + gutil.log('\nOr provide a module argument via \`--module\` or \`-m\`.', + '\nExample: --module=material.components.toast or -m material.components.dialog'); + process.exit(1); + } + return module; +} +` + diff --git a/app/templates/root/_karma.conf.js b/app/templates/root/_karma.conf.js new file mode 100644 index 0000000..530c480 --- /dev/null +++ b/app/templates/root/_karma.conf.js @@ -0,0 +1,66 @@ +// Karma configuration +// Generated on Sun Jun 15 2014 20:10:28 GMT-0600 (MDT) + +module.exports = function(config) { + config.set({ + + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '', + + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['jasmine'], + + + // list of files / patterns to load in the browser + files: [], + + + // list of files to exclude + exclude: [ + + ], + + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + + }, + + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['progress'], + + + // web server port + port: 9876, + + + // enable / disable colors in the output (reporters and logs) + colors: true, + + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['Chrome'], + + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: false + }); +}; + diff --git a/app/templates/root/_package.json b/app/templates/root/_package.json index 34aea66..bba857d 100644 --- a/app/templates/root/_package.json +++ b/app/templates/root/_package.json @@ -2,28 +2,31 @@ "name": "<%= projectName %>", "version": "0.0.1", "author": "<%= author %>", - "devDependencies": { - "grunt": "~0.4.2", - "grunt-contrib-jshint": "^0.9.2", - "grunt-contrib-nodeunit": "~0.2.0", - "grunt-contrib-uglify": "~0.2.7", - "grunt-contrib-clean": "^0.5.0", - "grunt-contrib-copy": "^0.5.0", - "grunt-contrib-concat": "^0.3.0", - "grunt-contrib-watch": "^0.6.1", - "grunt-contrib-coffee": "^0.10.1", - "grunt-contrib-less": "~0.11.0", - "grunt-coffeelint": "0.0.10", - "grunt-html2js": "^0.2.4", - "grunt-ng-annotate": "^0.3.2", - "grunt-express": "^1.2.1", - "karma": "^0.12.9", - "grunt-karma": "^0.8.2", - "karma-jasmine": "^0.1.5", - "karma-firefox-launcher": "^0.1.3", - "karma-chrome-launcher": "^0.1.3", - "karma-phantomjs-launcher": "^0.1.3", - "karma-coffee-preprocessor": "^0.2.1", - "lodash": "^2.4.1" - } + "dependencies": { + "bower": "~1.3.5", + "coffee-script": "~1.7.1", + "gulp": "~3.8.7", + "gulp-changed": "~0.4.0", + "gulp-coffee": "~2.0.1", + "gulp-concat": "^2.4.3", + "gulp-connect": "~2.0.6", + "gulp-filter": "^2.0.0", + "gulp-if": "^1.2.5", + "gulp-inject": "~0.4.1", + "gulp-jade": "~0.5.0", + "gulp-karma": "0.0.4", + "gulp-plumber": "~0.6.3", + "gulp-rename": "^1.2.0", + "gulp-sass": "~1.3.2", + "gulp-sourcemaps": "~1.1.1", + "gulp-util": "~2.2.17", + "gulp-watch": "~0.6.8", + "karma": "~0.12.16", + "path": "^0.11.14", + "stream-series": "^0.1.1" + }, + "devDependencies": { + "karma-jasmine": "~0.1.5", + "karma-chrome-launcher": "~0.1.4" + } } diff --git a/app/templates/root/src/_index.html b/app/templates/root/src/_index.html deleted file mode 100644 index a99a353..0000000 --- a/app/templates/root/src/_index.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - <%% styles.forEach( function ( file ) { %> - <%% }); %> - - <%% scripts.forEach( function ( file ) { %> - <%% }); %> - - -
- -
- -
- - - - diff --git a/app/templates/root/src/_index.jade b/app/templates/root/src/_index.jade new file mode 100644 index 0000000..302898c --- /dev/null +++ b/app/templates/root/src/_index.jade @@ -0,0 +1,25 @@ +doctype html +html(lang="en", ng-app="angularNgbpMaterial") + head + title= pageTitle + + // inject:css + // Note that inject and endinject must be surrounded by a space on both sides + // endinject + + // inject:js + // Note that inject and endinject must be surrounded by a space on both sides + // endinject + + body(ng-controller="AppController", ng-cloak) + + div(layout="column", layout-fill) + md-toolbar.md-primary + .md-toolbar-tools + | my title lol + span( flex ) + md-button + | look ! a button ! + + + diff --git a/app/templates/root/src/app/_app.coffee b/app/templates/root/src/app/_app.coffee index f4f147e..bd8e58f 100644 --- a/app/templates/root/src/app/_app.coffee +++ b/app/templates/root/src/app/_app.coffee @@ -1,18 +1,19 @@ -do (app=angular.module "<%= projectName %>", [ - '<%= projectName %>.home', - '<%= projectName %>.about', - 'templates-app', - 'templates-common', - 'ui.router.state', +do (app=angular.module "angularNgbpMaterial", [ 'ui.router', + 'ngMaterial' ]) -> - app.config ($stateProvider, $urlRouterProvider) -> - $urlRouterProvider.otherwise '/home' + app.config ([ + '$mdThemingProvider', + ($mdThemingProvider)-> + console.log $mdThemingProvider + $mdThemingProvider.theme('default') + .primaryColor('deep-purple') + .accentColor('cyan') + .warnColor('pink') + ]) - app.run -> + app.config ($stateProvider, $urlRouterProvider) -> + $urlRouterProvider.otherwise '' app.controller 'AppController', ($scope) -> - - - diff --git a/app/templates/root/src/app/about/about.coffee b/app/templates/root/src/app/about/about.coffee deleted file mode 100644 index a8b4719..0000000 --- a/app/templates/root/src/app/about/about.coffee +++ /dev/null @@ -1,22 +0,0 @@ -do (app=angular.module "<%= projectName %>.about", [ - 'ui.router' -]) -> - app.config ($stateProvider) -> - $stateProvider.state 'about', - url: '/about' - views: - "main": - controller: 'AboutController' - templateUrl: 'about/about.tpl.html' - data: - pageTitle: 'About' - - - app.controller 'AboutController', ($scope) -> - init = -> - # A definitive place to put everything that needs to run - # when the controller starts. Avoid writing any code outside - # of this function that executes immediately. - - init() - diff --git a/app/templates/root/src/app/about/about.js b/app/templates/root/src/app/about/about.js deleted file mode 100644 index 8156881..0000000 --- a/app/templates/root/src/app/about/about.js +++ /dev/null @@ -1,28 +0,0 @@ -(function(app) { - - app.config(function ($stateProvider) { - $stateProvider.state('about', { - url: '/about', - views: { - "main": { - controller: 'AboutController', - templateUrl: 'about/about.tpl.html' - } - }, - data:{ pageTitle: 'About' } - }); - }); - - app.controller('AboutController', function ($scope) { - - var init = function() { - // A definitive place to put everything that needs to run when the controller starts. Avoid - // writing any code outside of this function that executes immediately. - }; - - init(); - }); - -}(angular.module("<%= projectName %>.about", [ - 'ui.router' -]))); \ No newline at end of file diff --git a/app/templates/root/src/app/about/about.tpl.html b/app/templates/root/src/app/about/about.tpl.html deleted file mode 100644 index d9f495d..0000000 --- a/app/templates/root/src/app/about/about.tpl.html +++ /dev/null @@ -1,3 +0,0 @@ -

About

- -

This is what this is about.

\ No newline at end of file diff --git a/app/templates/root/src/app/app.spec.coffee b/app/templates/root/src/app/app.spec.coffee index f03f2a9..25192fd 100644 --- a/app/templates/root/src/app/app.spec.coffee +++ b/app/templates/root/src/app/app.spec.coffee @@ -1,17 +1,4 @@ -describe 'AppController', -> - describe 'isCurrentUrl', -> - AppCtrl = null +describe 'Controller', -> + it 'should be dummy', -> + expect(true).toBeTruthy() - beforeEach(module '<%= projectName %>') - - beforeEach(inject ($controller, _$location_, $rootScope) -> - $location = _$location_ - $scope = $rootScope.$new() - AppCtrl = $controller 'AppController', - $location: $location - $scope: $scope - ) - - it('should pass a dummy test', inject -> - expect(AppCtrl).toBeTruthy() - ) diff --git a/app/templates/root/src/app/home/_home.coffee b/app/templates/root/src/app/home/_home.coffee deleted file mode 100644 index 3bce8c3..0000000 --- a/app/templates/root/src/app/home/_home.coffee +++ /dev/null @@ -1,41 +0,0 @@ -### -# Each section of the site has its own module. It probably also has -# submodules, though this boilerplate is too simple to demonstrate it. Within -# 'src/app/home', however, could exist several additional folders representing -# additional modules that would then be listed as dependencies of this one. -# For example, a 'note' section could have the submodules 'note.create', -# 'note.delete', 'note.edit', etc. -# -# Regardless, so long as dependencies are managed correctly, the build process -# will automatically take take of the rest. -### -do (app=angular.module "<%= projectName %>.home", [ - 'ui.router' -]) -> - app.config ($stateProvider) -> - $stateProvider.state 'home', - url: '/home' - views: - "main": - controller: 'HomeController' - templateUrl: 'home/home.tpl.html' - data: - pageTitle: 'Home' - - - # As you add controllers to a module and they grow in size, feel free to - # place them in their own files. Let each module grow organically, adding - # appropriate organization and sub-folders as needed. - app.controller 'HomeController', ($scope) -> - init = -> - # A definitive place to put everything that needs to run when the - # controller starts. Avoid writing any code outside of this function - # that executes immediately. - - $scope.someVar = 'blue' - $scope.someList = ['one', 'two', 'three'] - $scope.someFunctionUsedByTheHomePage = -> - alert('Congratulations') - - init() - diff --git a/app/templates/root/src/app/home/_home.js b/app/templates/root/src/app/home/_home.js deleted file mode 100644 index 1fdef9f..0000000 --- a/app/templates/root/src/app/home/_home.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Each section of the site has its own module. It probably also has - * submodules, though this boilerplate is too simple to demonstrate it. Within - * 'src/app/home', however, could exist several additional folders representing - * additional modules that would then be listed as dependencies of this one. - * For example, a 'note' section could have the submodules 'note.create', - * 'note.delete', 'note.edit', etc. - * - * Regardless, so long as dependencies are managed correctly, the build process - * will automatically take take of the rest. - */ -(function(app) { - - app.config(function ($stateProvider) { - $stateProvider.state('home', { - url: '/home', - views: { - "main": { - controller: 'HomeController', - templateUrl: 'home/home.tpl.html' - } - }, - data:{ pageTitle: 'Home' } - }); - }); - - // As you add controllers to a module and they grow in size, feel free to place them in their own files. - // Let each module grow organically, adding appropriate organization and sub-folders as needed. - app.controller('HomeController', function ($scope) { - - var init = function() { - // A definitive place to put everything that needs to run when the controller starts. Avoid - // writing any code outside of this function that executes immediately. - }; - - $scope.someVar = 'blue'; - $scope.someList = ['one', 'two', 'three']; - $scope.someFunctionUsedByTheHomePage = function () { - alert('Congratulations'); - }; - - init(); - }); - -// The name of the module, followed by its dependencies (at the bottom to facilitate enclosure) -}(angular.module("<%= projectName %>.home", [ - 'ui.router' -]))); \ No newline at end of file diff --git a/app/templates/root/src/app/home/_home.spec.coffee b/app/templates/root/src/app/home/_home.spec.coffee deleted file mode 100644 index c9653aa..0000000 --- a/app/templates/root/src/app/home/_home.spec.coffee +++ /dev/null @@ -1,12 +0,0 @@ -### -# Tests sit right alongside the file they are testing, which is more intuitive -# and portable than separating 'src' and 'test' directories. Additionally, the -# build process will exclude all '.spec.js' files from the build -# automatically. -### -describe 'home section', -> - beforeEach(module '<%= projectName %>.home') - - it('should have a dummy test', inject -> - expect(true).toBeTruthy() - ) diff --git a/app/templates/root/src/app/home/_home.spec.js b/app/templates/root/src/app/home/_home.spec.js deleted file mode 100644 index c9657bc..0000000 --- a/app/templates/root/src/app/home/_home.spec.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Tests sit right alongside the file they are testing, which is more intuitive - * and portable than separating 'src' and 'test' directories. Additionally, the - * build process will exclude all '.spec.js' files from the build - * automatically. - */ -describe('home section', function () { - beforeEach(module('<%= projectName %>.home')); - - it('should have a dummy test', inject(function() { - expect(true).toBeTruthy(); - })); -}); diff --git a/app/templates/root/src/app/home/home.less b/app/templates/root/src/app/home/home.less deleted file mode 100644 index 1252815..0000000 --- a/app/templates/root/src/app/home/home.less +++ /dev/null @@ -1,3 +0,0 @@ -.homeClass { - margin: 0 0 0 0; -} \ No newline at end of file diff --git a/app/templates/root/src/app/home/home.tpl.html b/app/templates/root/src/app/home/home.tpl.html deleted file mode 100644 index acfebb5..0000000 --- a/app/templates/root/src/app/home/home.tpl.html +++ /dev/null @@ -1,11 +0,0 @@ -

Home of <%= _.humanize(projectName) %>

- -

Code it up

- -

- -

- -

\ No newline at end of file diff --git a/app/templates/root/src/less/README.md b/app/templates/root/src/less/README.md deleted file mode 100644 index a767315..0000000 --- a/app/templates/root/src/less/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# The `src/less` Directory - -This folder is actually fairly self-explanatory: it contains your LESS/CSS files to be compiled during the build. -The only important thing to note is that *only* `main.less` will be processed during the build, meaning that all -other stylesheets must be *imported* into that one. - -This should operate somewhat like the routing; the `main.less` file contains all of the site-wide styles, while -any styles that are route-specific should be imported into here from LESS files kept alongside the JavaScript -and HTML sources of that component. For example, the `home` section of the site has some custom styles, which -are imported like so: - -```css -@import '../app/home/home.less'; -``` - -The same principal, though not demonstrated in the code, would also apply to reusable components. CSS or LESS -files from external components would also be imported. If, for example, we had a Twitter feed directive with -an accompanying template and style, we would similarly import it: - -```css -@import '../common/twitterFeed/twitterFeedDirective.less'; -``` - -Using this decentralized approach for all our code (JavaScript, HTML, and CSS) creates a framework where a -component's directory can be dragged and dropped into *any other project* and it will "just work". - -I would like to eventually automate the importing during the build so that manually importing it here would no -longer be required, but more thought must be put in to whether this is the best approach. diff --git a/app/templates/root/src/less/main.less b/app/templates/root/src/less/main.less deleted file mode 100644 index de2dc9d..0000000 --- a/app/templates/root/src/less/main.less +++ /dev/null @@ -1,43 +0,0 @@ -/** - * This is the main application stylesheet. It should include or import all - * stylesheets used throughout the application as this is the only stylesheet in - * the Grunt configuration that is automatically processed. - */ - - -/** - * First, we include the Twitter Bootstrap LESS files. Only the ones used in the - * project should be imported as the rest are just wasting space. - */ - -@import '../../vendor/bootstrap/less/bootstrap.less'; - -/** - * This is our main variables file. We must include it last so we can overwrite any variable - * definitions in our imported stylesheets. - */ - -@import 'variables.less'; - - -/** - * Typography - */ - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto Regular'), local('Roboto-Regular'), url(fonts/Roboto-Regular.woff) format('woff'); -} - - -/** - * Now that all app-wide styles have been applied, we can load the styles for - * all the submodules and components we are using. - * - * TODO: In a later version of this boilerplate, I'd like to automate this. - */ - -@import '../app/home/home.less'; - diff --git a/app/templates/root/src/less/variables.less b/app/templates/root/src/less/variables.less deleted file mode 100644 index 1a53959..0000000 --- a/app/templates/root/src/less/variables.less +++ /dev/null @@ -1,12 +0,0 @@ -/** - * These are the variables used throughout the application. This is where - * overwrites that are not specific to components should be maintained. - */ - - - -/** - * Typography-related. - */ - -@sansFontFamily: 'Roboto', sans-serif; \ No newline at end of file diff --git a/app/templates/root/src/style/.DS_Store b/app/templates/root/src/style/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/app/templates/root/src/style/.DS_Store differ diff --git a/app/templates/root/src/style/main.scss b/app/templates/root/src/style/main.scss new file mode 100644 index 0000000..df946f3 --- /dev/null +++ b/app/templates/root/src/style/main.scss @@ -0,0 +1,22 @@ +/** + * This is the main application stylesheet. It should include or import all + * stylesheets used throughout the application as this is the only stylesheet in + * the Grunt configuration that is automatically processed. + */ + + +//@import 'angular_material'; + + + +/** + * Typography + */ + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto Regular'), local('Roboto-Regular'), url(fonts/Roboto-Regular.woff) format('woff'); +} + diff --git a/module/index.js b/module/index.js index 66e8d3a..5187d2f 100644 --- a/module/index.js +++ b/module/index.js @@ -52,8 +52,8 @@ var ModuleGenerator = yeoman.generators.NamedBase.extend({ this.template('_module.js', path.join(modulePath, this.camelModuleName + '.js')); this.template('_moduleSpec.js', path.join(modulePath, this.camelModuleName + '.spec.js')); } - this.template('_moduleHtml.tpl.html', path.join(modulePath, this.camelModuleName + '.tpl.html')); - this.template('_module.less', path.join(modulePath, this.camelModuleName + '.less')); + this.template('_module.jade', path.join(modulePath, this.camelModuleName + '.jade')); + this.template('_module.scss', path.join(modulePath, this.camelModuleName + '.scss')); this._addModuleToAppJs(this.projectName, this.camelModuleName, this.lowerModuleName); @@ -63,8 +63,8 @@ var ModuleGenerator = yeoman.generators.NamedBase.extend({ }, touchIndexHtml: function() { - // Touch the index.html file to force the index grunt task to rebuild it (that task adds the new module to the scripts) - var indexHtmlFilePath = 'src/index.html'; + // Touch the index.jade file to force the index grunt task to rebuild it (that task adds the new module to the scripts) + var indexHtmlFilePath = 'src/index.jade'; touch(indexHtmlFilePath, {mtime: true}); }, @@ -88,4 +88,4 @@ var ModuleGenerator = yeoman.generators.NamedBase.extend({ }); -module.exports = ModuleGenerator; \ No newline at end of file +module.exports = ModuleGenerator; diff --git a/module/templates/_moduleHtml.tpl.html b/module/templates/_module.jade similarity index 100% rename from module/templates/_moduleHtml.tpl.html rename to module/templates/_module.jade diff --git a/module/templates/_module.less b/module/templates/_module.scss similarity index 100% rename from module/templates/_module.less rename to module/templates/_module.scss diff --git a/package.json b/package.json index bfd5de9..e4c853e 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,13 @@ { - "name": "generator-ngbp", - "version": "0.1.2", - "description": "Yeoman generator based on the ngBoilerplate kickstarter, a best-practice boilerplate for scalable Angular projects built on a highly modular, folder-by-feature structure.", + "name": "generator-ngbp-material", + "version": "0.1.0", + "description": "Yeoman generator based on angular-material and the ngBoilerplate kickstarter, a best-practice boilerplate for scalable Angular projects built on a highly modular, folder-by-feature structure.", "keywords": [ "yeoman-generator", + "jade", + "coffee", + "angular-material", + "material-design", "angular", "angularjs", "boilerplate", @@ -13,18 +17,25 @@ "framework", "module", "client", - "grunt", + "gulp", "karma", "express", "app" ], "license": "MIT", "main": "app/index.js", - "repository": "thardy/generator-ngbp", + "bugs": { + "url": "https://github.com/Alexandre-Herve/generator-ngbp-material/issues", + "email": "alexandre.herve9@gmail.com" + }, + "repository": { + "url": "https://github.com/Alexandre-Herve/generator-ngbp-material", + "type": "git" + }, "author": { - "name": "Tim Hardy", - "email": "", - "url": "https://github.com/thardy" + "name": "Alexandre Hervé", + "email": "alexandre.herve9@gmail.com", + "url": "" }, "engines": { "node": ">=0.10.0"