what webapp vue create gruntjs yeoman

gruntjs - webapp - yeoman vue



aplicaciĆ³n web yeoman con grunt-connect-proxy no funciona (6)

He instalado el generador de aplicaciones web yeoman y estoy tratando de configurar un proxy para otro servidor.

Instalé el proxy con lo siguiente. npm instala grunt-connect-proxy --save-dev

Cuando ejecuto el servidor de grunt, muestra

Running "configureProxies" task Proxy created for: /people to localhost:3000

Luego me dirige a una página que se ejecuta en localhost: 9000 que dice "No se puede OBTENER /". Hay un servidor ejecutándose en localhost: 3000 y he intentado con otros dominios sin éxito.

Aquí está mi Gruntfile.js

// Generated on 2013-10-01 using generator-webapp 0.4.2 ''use strict''; var proxySnippet = require(''grunt-connect-proxy/lib/utils'').proxyRequest; // # Globbing // for performance reasons we''re only matching one level down: // ''test/spec/{,*/}*.js'' // use this if you want to recursively match all subfolders: // ''test/spec/**/*.js'' module.exports = function (grunt) { // show elapsed time at the end require(''time-grunt'')(grunt); // load all grunt tasks require(''load-grunt-tasks'')(grunt); // configurable paths var yeomanConfig = { app: ''app'', dist: ''dist'' }; grunt.initConfig({ yeoman: yeomanConfig, watch: { coffee: { files: [''<%= yeoman.app %>/scripts/{,*/}*.coffee''], tasks: [''coffee:dist''] }, coffeeTest: { files: [''test/spec/{,*/}*.coffee''], tasks: [''coffee:test''] }, compass: { files: [''<%= yeoman.app %>/styles/{,*/}*.{scss,sass}''], tasks: [''compass:server'', ''autoprefixer''] }, styles: { files: [''<%= yeoman.app %>/styles/{,*/}*.css''], tasks: [''copy:styles'', ''autoprefixer''] }, livereload: { options: { livereload: ''<%= connect.options.livereload %>'' }, files: [ ''<%= yeoman.app %>/*.html'', ''.tmp/styles/{,*/}*.css'', ''{.tmp,<%= yeoman.app %>}/scripts/{,*/}*.js'', ''<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'' ] } }, connect: { options: { port: 9000, livereload: 35729, // change this to ''0.0.0.0'' to access the server from outside hostname: ''localhost'' }, proxies: [ { context: ''/people'', host: ''localhost'', port: 3000 } ], livereload: { options: { open: true, base: [ ''.tmp'', yeomanConfig.app ], middleware: function (connect) { return [ proxySnippet ]; } } }, test: { options: { base: [ ''.tmp'', ''test'', yeomanConfig.app ] } }, dist: { options: { open: true, base: yeomanConfig.dist } } }, clean: { dist: { files: [{ dot: true, src: [ ''.tmp'', ''<%= yeoman.dist %>/*'', ''!<%= yeoman.dist %>/.git*'' ] }] }, server: ''.tmp'' }, jshint: { options: { jshintrc: ''.jshintrc'' }, all: [ ''Gruntfile.js'', ''<%= yeoman.app %>/scripts/{,*/}*.js'', ''!<%= yeoman.app %>/scripts/vendor/*'', ''test/spec/{,*/}*.js'' ] }, mocha: { all: { options: { run: true, urls: [''http://<%= connect.test.options.hostname %>:<%= connect.test.options.port %>/index.html''] } } }, coffee: { dist: { files: [{ expand: true, cwd: ''<%= yeoman.app %>/scripts'', src: ''{,*/}*.coffee'', dest: ''.tmp/scripts'', ext: ''.js'' }] }, test: { files: [{ expand: true, cwd: ''test/spec'', src: ''{,*/}*.coffee'', dest: ''.tmp/spec'', ext: ''.js'' }] } }, compass: { options: { sassDir: ''<%= yeoman.app %>/styles'', cssDir: ''.tmp/styles'', generatedImagesDir: ''.tmp/images/generated'', imagesDir: ''<%= yeoman.app %>/images'', javascriptsDir: ''<%= yeoman.app %>/scripts'', fontsDir: ''<%= yeoman.app %>/styles/fonts'', importPath: ''<%= yeoman.app %>/bower_components'', httpImagesPath: ''/images'', httpGeneratedImagesPath: ''/images/generated'', httpFontsPath: ''/styles/fonts'', relativeAssets: false }, dist: { options: { generatedImagesDir: ''<%= yeoman.dist %>/images/generated'' } }, server: { options: { debugInfo: true } } }, autoprefixer: { options: { browsers: [''last 1 version''] }, dist: { files: [{ expand: true, cwd: ''.tmp/styles/'', src: ''{,*/}*.css'', dest: ''.tmp/styles/'' }] } }, // not used since Uglify task does concat, // but still available if needed /*concat: { dist: {} },*/ requirejs: { dist: { // Options: https://github.com/jrburke/r.js/blob/master/build/example.build.js options: { // `name` and `out` is set by grunt-usemin baseUrl: yeomanConfig.app + ''/scripts'', optimize: ''none'', // TODO: Figure out how to make sourcemaps work with grunt-usemin // https://github.com/yeoman/grunt-usemin/issues/30 //generateSourceMaps: true, // required to support SourceMaps // http://requirejs.org/docs/errors.html#sourcemapcomments preserveLicenseComments: false, useStrict: true, wrap: true //uglify2: {} // https://github.com/mishoo/UglifyJS2 } } }, rev: { dist: { files: { src: [ ''<%= yeoman.dist %>/scripts/{,*/}*.js'', ''<%= yeoman.dist %>/styles/{,*/}*.css'', ''<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp}'', ''<%= yeoman.dist %>/styles/fonts/{,*/}*.*'' ] } } }, useminPrepare: { options: { dest: ''<%= yeoman.dist %>'' }, html: ''<%= yeoman.app %>/index.html'' }, usemin: { options: { dirs: [''<%= yeoman.dist %>''] }, html: [''<%= yeoman.dist %>/{,*/}*.html''], css: [''<%= yeoman.dist %>/styles/{,*/}*.css''] }, imagemin: { dist: { files: [{ expand: true, cwd: ''<%= yeoman.app %>/images'', src: ''{,*/}*.{png,jpg,jpeg}'', dest: ''<%= yeoman.dist %>/images'' }] } }, svgmin: { dist: { files: [{ expand: true, cwd: ''<%= yeoman.app %>/images'', src: ''{,*/}*.svg'', dest: ''<%= yeoman.dist %>/images'' }] } }, cssmin: { // This task is pre-configured if you do not wish to use Usemin // blocks for your CSS. By default, the Usemin block from your // `index.html` will take care of minification, e.g. // // <!-- build:css({.tmp,app}) styles/main.css --> // // dist: { // files: { // ''<%= yeoman.dist %>/styles/main.css'': [ // ''.tmp/styles/{,*/}*.css'', // ''<%= yeoman.app %>/styles/{,*/}*.css'' // ] // } // } }, htmlmin: { dist: { options: { /*removeCommentsFromCDATA: true, // https://github.com/yeoman/grunt-usemin/issues/44 //collapseWhitespace: true, collapseBooleanAttributes: true, removeAttributeQuotes: true, removeRedundantAttributes: true, useShortDoctype: true, removeEmptyAttributes: true, removeOptionalTags: true*/ }, files: [{ expand: true, cwd: ''<%= yeoman.app %>'', src: ''*.html'', dest: ''<%= yeoman.dist %>'' }] } }, // Put files not handled in other tasks here copy: { dist: { files: [{ expand: true, dot: true, cwd: ''<%= yeoman.app %>'', dest: ''<%= yeoman.dist %>'', src: [ ''*.{ico,png,txt}'', ''.htaccess'', ''images/{,*/}*.{webp,gif}'', ''styles/fonts/{,*/}*.*'', ''bower_components/sass-bootstrap/fonts/*.*'' ] }] }, styles: { expand: true, dot: true, cwd: ''<%= yeoman.app %>/styles'', dest: ''.tmp/styles/'', src: ''{,*/}*.css'' } }, modernizr: { devFile: ''<%= yeoman.app %>/bower_components/modernizr/modernizr.js'', outputFile: ''<%= yeoman.dist %>/bower_components/modernizr/modernizr.js'', files: [ ''<%= yeoman.dist %>/scripts/{,*/}*.js'', ''<%= yeoman.dist %>/styles/{,*/}*.css'', ''!<%= yeoman.dist %>/scripts/vendor/*'' ], uglify: true }, concurrent: { server: [ ''compass'', ''coffee:dist'', ''copy:styles'' ], test: [ ''coffee'', ''copy:styles'' ], dist: [ ''coffee'', ''compass'', ''copy:styles'', ''imagemin'', ''svgmin'', ''htmlmin'' ] }, bower: { options: { exclude: [''modernizr''] }, all: { rjsConfig: ''<%= yeoman.app %>/scripts/main.js'' } } }); grunt.registerTask(''server'', function (target) { if (target === ''dist'') { return grunt.task.run([''build'', ''connect:dist:keepalive'']); } grunt.task.run([ ''clean:server'', ''configureProxies'', ''concurrent:server'', ''autoprefixer'', ''connect:livereload'', ''watch'' ]); }); grunt.registerTask(''test'', [ ''clean:server'', ''concurrent:test'', ''autoprefixer'', ''connect:test'', ''mocha'' ]); grunt.registerTask(''build'', [ ''clean:dist'', ''useminPrepare'', ''concurrent:dist'', ''autoprefixer'', ''requirejs'', ''concat'', ''cssmin'', ''uglify'', ''modernizr'', ''copy:dist'', ''rev'', ''usemin'' ]); grunt.registerTask(''default'', [ ''jshint'', ''test'', ''build'' ]);

};

EDITAR: aquí está mi último trabajo GruntFile

// Generated on 2013-10-06 using generator-webapp 0.4.3 ''use strict''; var proxySnippet = require(''grunt-connect-proxy/lib/utils'').proxyRequest; var mountFolder = function (connect, dir) { return connect.static(require(''path'').resolve(dir)); }; // # Globbing // for performance reasons we''re only matching one level down: // ''test/spec/{,*/}*.js'' // use this if you want to recursively match all subfolders: // ''test/spec/**/*.js'' module.exports = function (grunt) { // show elapsed time at the end require(''time-grunt'')(grunt); // load all grunt tasks require(''load-grunt-tasks'')(grunt); grunt.initConfig({ // configurable paths yeoman: { app: ''app'', dist: ''dist'' }, watch: { compass: { files: [''<%= yeoman.app %>/styles/{,*/}*.{scss,sass}''], tasks: [''compass:server'', ''autoprefixer''] }, styles: { files: [''<%= yeoman.app %>/styles/{,*/}*.css''], tasks: [''copy:styles'', ''autoprefixer''] }, livereload: { options: { livereload: ''<%= connect.options.livereload %>'' }, files: [ ''<%= yeoman.app %>/*.html'', ''.tmp/styles/{,*/}*.css'', ''{.tmp,<%= yeoman.app %>}/scripts/{,*/}*.js'', ''<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'' ] } }, connect: { options: { port: 9000, livereload: 35729, // change this to ''0.0.0.0'' to access the server from outside hostname: ''localhost'' }, proxies: [ { context: ''/api'', host: ''localhost'', port: 4000, https: false } ], livereload: { options: { open: true, base: [ ''.tmp'', ''<%= yeoman.app %>'' ], middleware: function (connect) { return [ proxySnippet, mountFolder(connect, ''.tmp''), mountFolder(connect, ''app'') ]; } } }, test: { options: { base: [ ''.tmp'', ''test'', ''<%= yeoman.app %>'' ] } }, dist: { options: { open: true, base: ''<%= yeoman.dist %>'' } } }, clean: { dist: { files: [{ dot: true, src: [ ''.tmp'', ''<%= yeoman.dist %>/*'', ''!<%= yeoman.dist %>/.git*'' ] }] }, server: ''.tmp'' }, jshint: { options: { jshintrc: ''.jshintrc'' }, all: [ ''Gruntfile.js'', ''<%= yeoman.app %>/scripts/{,*/}*.js'', ''!<%= yeoman.app %>/scripts/vendor/*'', ''test/spec/{,*/}*.js'' ] }, mocha: { all: { options: { run: true, urls: [''http://<%= connect.test.options.hostname %>:<%= connect.test.options.port %>/index.html''] } } }, compass: { options: { sassDir: ''<%= yeoman.app %>/styles'', cssDir: ''.tmp/styles'', generatedImagesDir: ''.tmp/images/generated'', imagesDir: ''<%= yeoman.app %>/images'', javascriptsDir: ''<%= yeoman.app %>/scripts'', fontsDir: ''<%= yeoman.app %>/styles/fonts'', importPath: ''<%= yeoman.app %>/bower_components'', httpImagesPath: ''/images'', httpGeneratedImagesPath: ''/images/generated'', httpFontsPath: ''/styles/fonts'', relativeAssets: false, assetCacheBuster: false }, dist: { options: { generatedImagesDir: ''<%= yeoman.dist %>/images/generated'' } }, server: { options: { debugInfo: true } } }, autoprefixer: { options: { browsers: [''last 1 version''] }, dist: { files: [{ expand: true, cwd: ''.tmp/styles/'', src: ''{,*/}*.css'', dest: ''.tmp/styles/'' }] } }, // not used since Uglify task does concat, // but still available if needed /*concat: { dist: {} },*/ requirejs: { dist: { // Options: https://github.com/jrburke/r.js/blob/master/build/example.build.js options: { // `name` and `out` is set by grunt-usemin baseUrl: ''<%= yeoman.app %>/scripts'', optimize: ''none'', // TODO: Figure out how to make sourcemaps work with grunt-usemin // https://github.com/yeoman/grunt-usemin/issues/30 //generateSourceMaps: true, // required to support SourceMaps // http://requirejs.org/docs/errors.html#sourcemapcomments preserveLicenseComments: false, useStrict: true, wrap: true //uglify2: {} // https://github.com/mishoo/UglifyJS2 } } }, rev: { dist: { files: { src: [ ''<%= yeoman.dist %>/scripts/{,*/}*.js'', ''<%= yeoman.dist %>/styles/{,*/}*.css'', ''<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp}'', ''<%= yeoman.dist %>/styles/fonts/{,*/}*.*'' ] } } }, useminPrepare: { options: { dest: ''<%= yeoman.dist %>'' }, html: ''<%= yeoman.app %>/index.html'' }, usemin: { options: { dirs: [''<%= yeoman.dist %>''] }, html: [''<%= yeoman.dist %>/{,*/}*.html''], css: [''<%= yeoman.dist %>/styles/{,*/}*.css''] }, imagemin: { dist: { files: [{ expand: true, cwd: ''<%= yeoman.app %>/images'', src: ''{,*/}*.{png,jpg,jpeg}'', dest: ''<%= yeoman.dist %>/images'' }] } }, svgmin: { dist: { files: [{ expand: true, cwd: ''<%= yeoman.app %>/images'', src: ''{,*/}*.svg'', dest: ''<%= yeoman.dist %>/images'' }] } }, cssmin: { // This task is pre-configured if you do not wish to use Usemin // blocks for your CSS. By default, the Usemin block from your // `index.html` will take care of minification, e.g. // // <!-- build:css({.tmp,app}) styles/main.css --> // // dist: { // files: { // ''<%= yeoman.dist %>/styles/main.css'': [ // ''.tmp/styles/{,*/}*.css'', // ''<%= yeoman.app %>/styles/{,*/}*.css'' // ] // } // } }, htmlmin: { dist: { options: { /*removeCommentsFromCDATA: true, // https://github.com/yeoman/grunt-usemin/issues/44 //collapseWhitespace: true, collapseBooleanAttributes: true, removeAttributeQuotes: true, removeRedundantAttributes: true, useShortDoctype: true, removeEmptyAttributes: true, removeOptionalTags: true*/ }, files: [{ expand: true, cwd: ''<%= yeoman.app %>'', src: ''*.html'', dest: ''<%= yeoman.dist %>'' }] } }, // Put files not handled in other tasks here copy: { dist: { files: [{ expand: true, dot: true, cwd: ''<%= yeoman.app %>'', dest: ''<%= yeoman.dist %>'', src: [ ''*.{ico,png,txt}'', ''.htaccess'', ''images/{,*/}*.{webp,gif}'', ''styles/fonts/{,*/}*.*'', ''bower_components/sass-bootstrap/fonts/*.*'', ''templates/{,*/}*.*'' ] }] }, styles: { expand: true, dot: true, cwd: ''<%= yeoman.app %>/styles'', dest: ''.tmp/styles/'', src: ''{,*/}*.css'' } }, concurrent: { server: [ ''compass'', ''copy:styles'' ], test: [ ''copy:styles'' ], dist: [ ''compass'', ''copy:styles'', ''imagemin'', ''svgmin'', ''htmlmin'' ] }, bower: { options: { exclude: [''modernizr''] }, all: { rjsConfig: ''<%= yeoman.app %>/scripts/main.js'' } } }); grunt.registerTask(''server'', function (target) { if (target === ''dist'') { return grunt.task.run([''build'', ''connect:dist:keepalive'']); } grunt.task.run([ ''clean:server'', ''configureProxies'', ''concurrent:server'', ''autoprefixer'', ''connect:livereload'', ''watch'' ]); }); grunt.registerTask(''test'', [ ''clean:server'', ''concurrent:test'', ''autoprefixer'', ''connect:test'', ''mocha'' ]); grunt.registerTask(''build'', [ ''clean:dist'', ''useminPrepare'', ''concurrent:dist'', ''autoprefixer'', ''requirejs'', ''concat'', ''cssmin'', ''uglify'', ''copy:dist'', ''rev'', ''usemin'' ]); grunt.registerTask(''default'', [ ''jshint'', ''test'', ''build'' ]); };


Cambie el objetivo de la carga de conexión en vivo de la siguiente manera:

livereload: { options: { open: true, base: [ ''.tmp'', yeomanConfig.app ], middleware: function (connect) { return [ proxySnippet, connect.static(require(''path'').resolve(''app'')), connect.static(require(''path'').resolve(''.tmp'')) ]; } } }


También deberá configurar el middleware en "prueba" para que el proxy funcione en casos de prueba funcional.

connect: { proxies: [ { context: ''/api'', host: ''localhost'', port: 8080, https: false, changeOrigin: false, xforward: false } ], livereload: { options: { middleware: function (connect, options) { if (!Array.isArray(options.base)) { options.base = [options.base]; } // Setup the proxy var middlewares = [require(''grunt-connect-proxy/lib/utils'').proxyRequest]; // Serve static files. options.base.forEach(function (base) { middlewares.push(connect.static(base)); }); // Make directory browse-able. var directory = options.directory || options.base[options.base.length - 1]; middlewares.push(connect.directory(directory)); return middlewares; }, open: true, base: [ ''.tmp'', ''<%= yeoman.app %>'' ] } }, test: { options: { middleware: function (connect, options) { if (!Array.isArray(options.base)) { options.base = [options.base]; } // Setup the proxy var middlewares = [require(''grunt-connect-proxy/lib/utils'').proxyRequest]; // Serve static files. options.base.forEach(function (base) { middlewares.push(connect.static(base)); }); // Make directory browse-able. var directory = options.directory || options.base[options.base.length - 1]; middlewares.push(connect.directory(directory)); return middlewares; }, port: 9001, base: [ ''.tmp'', ''test'', ''<%= yeoman.app %>'' ] } } } grunt.registerTask(''e2e'', [ ''clean:server'', ''concurrent:test'', ''autoprefixer'', ''configureProxies:server'', ''connect:test'', ''protractor:run'' ]);


El enfoque anterior funciona, solo agrega una trampa que encontré.

Cuando proxy una solicitud como

proxies: [ { context: ''/api'', host: ''localhost'', port: 8080, https: false, changeOrigin: false, xforward: false } ],

a continuación, localhost:9000/api/ping enviará a localhost:8080/api/ping , por lo que debería tener un extremo de escucha allí. No reescribe (como esperaba) localhost:8080/ping básicamente eliminando el contexto. Si desea reescribir, debe especificarlo explícitamente.

proxies: [ context: ''/context'', host: ''host'', port: 8080, rewrite: { ''^/removingcontext'': '''', ''^/changingcontext'': ''/anothercontext'' } ]


para yeoman-angular v <0.9.8
cambia tu objeto de conexión ronco para que se vea así

connect: { options: { port: 9000, // Change this to ''0.0.0.0'' to access the server from outside. hostname: ''localhost'', livereload: 35729 }, proxies: [ { context: ''/api'', // the context of the data service host: ''localhost'', // wherever the data service is running port: 80 // the port that the data service is running on } ], livereload: { options: { open: true, middleware: function (connect) { var middlewares = []; // Setup the proxy middlewares.push(require(''grunt-connect-proxy/lib/utils'').proxyRequest); // Serve static files middlewares.push( connect.static(''.tmp''), connect().use( ''/bower_components'', connect.static(''./bower_components'') ), connect.static(appConfig.app) ); return middlewares; } } }, ... // removed for brevity since there will be no changes on the test and dist objects }


Esto funcionó para mí

livereload: { options: { open: true, middleware: function (connect) { return [ proxySnippet, connect.static(''.tmp''), connect().use( ''/bower_components'', connect.static(''./bower_components'') ), connect().use( ''/app/styles'', connect.static(''./app/styles'') ), connect.static(appConfig.app) ]; } } },


Este es todo mi gruntfile que funciona en una aplicación web ngular respaldada con servicios de mvc rest de primavera . Todos los cambios que escribí están anotados con "// RAG"

// Generated on 2015-08-12 using generator-angular 0.12.1 ''use strict''; // # Globbing // for performance reasons we''re only matching one level down: // ''test/spec/{,*/}*.js'' // use this if you want to recursively match all subfolders: // ''test/spec/**/*.js'' module.exports = function (grunt) { // Time how long tasks take. Can help when optimizing build times require(''time-grunt'')(grunt); // Automatically load required Grunt tasks require(''jit-grunt'')(grunt, { useminPrepare: ''grunt-usemin'', ngtemplates: ''grunt-angular-templates'', cdnify: ''grunt-google-cdn'' }); // Configurable paths for the application var appConfig = { app: require(''./bower.json'').appPath || ''app'', dist: ''../../../target/webapp'' }; // Define the configuration for all the tasks grunt.initConfig({ // Project settings yeoman: appConfig, // Watches files for changes and runs tasks based on the changed files watch: { bower: { files: [''bower.json''], tasks: [''wiredep''] }, js: { files: [''<%= yeoman.app %>/scripts/{,*/}*.js''], tasks: [''newer:jshint:all''], options: { livereload: ''<%= connect.options.livereload %>'' } }, jsTest: { files: [''test/spec/{,*/}*.js''], tasks: [''newer:jshint:test'', ''karma''] }, compass: { files: [''<%= yeoman.app %>/styles/{,*/}*.{scss,sass}''], tasks: [''compass:server'', ''autoprefixer:server''] }, gruntfile: { files: [''Gruntfile.js''] }, livereload: { options: { livereload: ''<%= connect.options.livereload %>'' }, files: [ ''<%= yeoman.app %>/{,*/}*.html'', ''.tmp/styles/{,*/}*.css'', ''<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'' ] } }, // The actual grunt server settings connect: { options: { port: 9000, // Change this to ''0.0.0.0'' to access the server from outside. hostname: ''localhost'', livereload: 35729 }, //RAG proxies: [ { context: ''/ws'', host: ''localhost'', port: 8080, //https: false, //xforward: false, //headers: { // "x-custom-added-header": value // }, //hideHeaders: [''x-removed-header''], //rewrite: { // ''^/ws'': '''' //} } ], livereload: { options: { open: true, //RAG /* middleware: function (connect) { return [ connect.static(''.tmp''), connect().use( ''/bower_components'', connect.static(''./bower_components'') ), connect().use( ''/app/styles'', connect.static(''./app/styles'') ), connect.static(appConfig.app) ]; } */ middleware: function (connect, options) { var middlewares = [ connect.static(''.tmp''), connect().use( ''/bower_components'', connect.static(''./bower_components'') ), connect().use( ''/app/styles'', connect.static(''./app/styles'') ), connect.static(appConfig.app) ]; if (!Array.isArray(options.base)) { options.base = [options.base]; } // Setup the proxy middlewares.push(require(''grunt-connect-proxy/lib/utils'').proxyRequest); // Serve static files options.base.forEach(function(base) { middlewares.push(connect.static(base)); }); return middlewares; } } }, test: { options: { port: 9001, middleware: function (connect) { return [ connect.static(''.tmp''), connect.static(''test''), connect().use( ''/bower_components'', connect.static(''./bower_components'') ), connect.static(appConfig.app) ]; } } }, dist: { options: { open: true, base: ''<%= yeoman.dist %>'' } } }, // Make sure code styles are up to par and there are no obvious mistakes jshint: { options: { jshintrc: ''.jshintrc'', reporter: require(''jshint-stylish'') }, all: { src: [ ''Gruntfile.js'', ''<%= yeoman.app %>/scripts/{,*/}*.js'' ] }, test: { options: { jshintrc: ''test/.jshintrc'' }, src: [''test/spec/{,*/}*.js''] } }, // Empties folders to start fresh clean: { dist: { files: [{ dot: true, src: [ ''.tmp'', ''<%= yeoman.dist %>/{,*/}*'', ''!<%= yeoman.dist %>/.git{,*/}*'' ] }] }, server: ''.tmp'' }, // Add vendor prefixed styles autoprefixer: { options: { browsers: [''last 1 version''] }, server: { options: { map: true }, files: [{ expand: true, cwd: ''.tmp/styles/'', src: ''{,*/}*.css'', dest: ''.tmp/styles/'' }] }, dist: { files: [{ expand: true, cwd: ''.tmp/styles/'', src: ''{,*/}*.css'', dest: ''.tmp/styles/'' }] } }, // Automatically inject Bower components into the app wiredep: { app: { src: [''<%= yeoman.app %>/index.html''], ignorePath: //././// }, test: { devDependencies: true, src: ''<%= karma.unit.configFile %>'', ignorePath: //././//, fileTypes:{ js: { block: /(([/s/t]*)//{2}/s*?bower:/s*?(/S*))(/n|/r|.)*?(//{2}/s*endbower)/gi, detect: { js: /''(.*/.js)''/gi }, replace: { js: ''/'{{filePath}}/','' } } } }, sass: { src: [''<%= yeoman.app %>/styles/{,*/}*.{scss,sass}''], ignorePath: /(/././/){1,2}bower_components/// } }, // Compiles Sass to CSS and generates necessary files if requested compass: { options: { sassDir: ''<%= yeoman.app %>/styles'', cssDir: ''.tmp/styles'', generatedImagesDir: ''.tmp/images/generated'', imagesDir: ''<%= yeoman.app %>/images'', javascriptsDir: ''<%= yeoman.app %>/scripts'', fontsDir: ''<%= yeoman.app %>/styles/fonts'', importPath: ''./bower_components'', httpImagesPath: ''/images'', httpGeneratedImagesPath: ''/images/generated'', httpFontsPath: ''/styles/fonts'', relativeAssets: false, assetCacheBuster: false, raw: ''Sass::Script::Number.precision = 10/n'' }, dist: { options: { generatedImagesDir: ''<%= yeoman.dist %>/images/generated'' } }, server: { options: { sourcemap: true } } }, // Renames files for browser caching purposes filerev: { dist: { src: [ ''<%= yeoman.dist %>/scripts/{,*/}*.js'', ''<%= yeoman.dist %>/styles/{,*/}*.css'', ''<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'', ''<%= yeoman.dist %>/styles/fonts/*'' ] } }, // Reads HTML for usemin blocks to enable smart builds that automatically // concat, minify and revision files. Creates configurations in memory so // additional tasks can operate on them useminPrepare: { html: ''<%= yeoman.app %>/index.html'', options: { dest: ''<%= yeoman.dist %>'', flow: { html: { steps: { js: [''concat'', ''uglifyjs''], css: [''cssmin''] }, post: {} } } } }, // Performs rewrites based on filerev and the useminPrepare configuration usemin: { html: [''<%= yeoman.dist %>/{,*/}*.html''], css: [''<%= yeoman.dist %>/styles/{,*/}*.css''], js: [''<%= yeoman.dist %>/scripts/{,*/}*.js''], options: { assetsDirs: [ ''<%= yeoman.dist %>'', ''<%= yeoman.dist %>/images'', ''<%= yeoman.dist %>/styles'' ], patterns: { js: [[/(images//[^''''""]*/.(png|jpg|jpeg|gif|webp|svg))/g, ''Replacing references to images'']] } } }, // The following *-min tasks will produce minified files in the dist folder // By default, your `index.html`''s <!-- Usemin block --> will take care of // minification. These next options are pre-configured if you do not wish // to use the Usemin blocks. // cssmin: { // dist: { // files: { // ''<%= yeoman.dist %>/styles/main.css'': [ // ''.tmp/styles/{,*/}*.css'' // ] // } // } // }, // uglify: { // dist: { // files: { // ''<%= yeoman.dist %>/scripts/scripts.js'': [ // ''<%= yeoman.dist %>/scripts/scripts.js'' // ] // } // } // }, // concat: { // dist: {} // }, imagemin: { dist: { files: [{ expand: true, cwd: ''<%= yeoman.app %>/images'', src: ''{,*/}*.{png,jpg,jpeg,gif}'', dest: ''<%= yeoman.dist %>/images'' }] } }, svgmin: { dist: { files: [{ expand: true, cwd: ''<%= yeoman.app %>/images'', src: ''{,*/}*.svg'', dest: ''<%= yeoman.dist %>/images'' }] } }, htmlmin: { dist: { options: { collapseWhitespace: true, conservativeCollapse: true, collapseBooleanAttributes: true, removeCommentsFromCDATA: true }, files: [{ expand: true, cwd: ''<%= yeoman.dist %>'', src: [''*.html''], dest: ''<%= yeoman.dist %>'' }] } }, ngtemplates: { dist: { options: { module: ''mainApp'', htmlmin: ''<%= htmlmin.dist.options %>'', usemin: ''scripts/scripts.js'' }, cwd: ''<%= yeoman.app %>'', src: ''views/{,*/}*.html'', dest: ''.tmp/templateCache.js'' } }, // ng-annotate tries to make the code safe for minification automatically // by using the Angular long form for dependency injection. ngAnnotate: { dist: { files: [{ expand: true, cwd: ''.tmp/concat/scripts'', src: ''*.js'', dest: ''.tmp/concat/scripts'' }] } }, // Replace Google CDN references cdnify: { dist: { html: [''<%= yeoman.dist %>/*.html''] } }, // Copies remaining files to places other tasks can use copy: { dist: { files: [{ expand: true, dot: true, cwd: ''<%= yeoman.app %>'', dest: ''<%= yeoman.dist %>'', src: [ ''*.{ico,png,txt}'', ''.htaccess'', ''*.html'', ''images/{,*/}*.{webp}'', ''styles/fonts/{,*/}*.*'' ] }, { expand: true, cwd: ''.tmp/images'', dest: ''<%= yeoman.dist %>/images'', src: [''generated/*''] }, { expand: true, cwd: ''.'', src: ''bower_components/bootstrap-sass-official/assets/fonts/bootstrap/*'', dest: ''<%= yeoman.dist %>'' }] }, styles: { expand: true, cwd: ''<%= yeoman.app %>/styles'', dest: ''.tmp/styles/'', src: ''{,*/}*.css'' } }, // Run some tasks in parallel to speed up the build process concurrent: { server: [ ''compass:server'' ], test: [ ''compass'' ], dist: [ ''compass:dist'', ''imagemin'', ''svgmin'' ] }, // Test settings karma: { unit: { configFile: ''test/karma.conf.js'', singleRun: true } } }); grunt.loadNpmTasks(''grunt-connect-proxy''); //RAG grunt.registerTask(''serve'', ''Compile then start a connect web server'', function (target) { if (target === ''dist'') { return grunt.task.run([''build'', ''connect:dist:keepalive'']); } grunt.task.run([ ''clean:server'', ''wiredep'', ''concurrent:server'', ''autoprefixer:server'', ''configureProxies:server'', // RAG ''connect:livereload'', ''watch'' ]); }); grunt.registerTask(''server'', ''DEPRECATED TASK. Use the "serve" task instead'', function (target) { grunt.log.warn(''The `server` task has been deprecated. Use `grunt serve` to start a server.''); grunt.task.run([''serve:'' + target]); }); grunt.registerTask(''test'', [ ''clean:server'', ''wiredep'', ''concurrent:test'', ''autoprefixer'', ''connect:test'', ''karma'' ]); grunt.registerTask(''build'', [ ''clean:dist'', ''wiredep'', ''useminPrepare'', ''concurrent:dist'', ''autoprefixer'', ''ngtemplates'', ''concat'', ''ngAnnotate'', ''copy:dist'', ''cdnify'', ''cssmin'', ''uglify'', ''filerev'', ''usemin'', ''htmlmin'' ]); grunt.registerTask(''default'', [ ''newer:jshint'', ''test'', ''build'' ]); };