Advertisement
marius_stuparu

Gruntfile.js

Aug 6th, 2014
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'use strict';
  2.  
  3. // Add PHP support to Connect
  4. var phpMiddleware = require('connect-php');
  5.  
  6. // # Globbing
  7. // for performance reasons we're only matching one level down:
  8. // 'test/spec/{,*/}*.js'
  9. // use this if you want to recursively match all subfolders:
  10. // 'test/spec/**/*.js'
  11.  
  12. module.exports = function (grunt) {
  13.     // Load grunt tasks automatically
  14.     require('load-grunt-tasks')(grunt);
  15.  
  16.     // Time how long tasks take. Can help when optimizing build times
  17.     require('time-grunt')(grunt);
  18.  
  19.     // Configurable paths
  20.     var config = {
  21.         app: 'app',
  22.         dist: 'dist'
  23.     };
  24.  
  25.     // Define the configuration for all the tasks
  26.     grunt.initConfig({
  27.         // Project settings
  28.         config: config,
  29.  
  30.         // Watches files for changes and runs tasks based on the changed files
  31.         watch: {
  32.             bower: {
  33.                 files: ['bower.json'],
  34.                 tasks: ['bowerInstall']
  35.             },
  36.             js: {
  37.                 files: ['<%= config.app %>/scripts/{,*/}*.js'],
  38.                 tasks: ['jshint'],
  39.                 options: {
  40.                     livereload: true
  41.                 }
  42.             },
  43.             jstest: {
  44.                 files: ['test/spec/{,*/}*.js'],
  45.                 tasks: ['test:watch']
  46.             },
  47.             gruntfile: {
  48.                 files: ['Gruntfile.js']
  49.             },
  50.             // sass: {
  51.             //     files: ['<%= config.app %>/styles/{,*/}*.{scss,sass}'],
  52.             //     tasks: ['sass:server']
  53.             // },
  54.             compass: {
  55.                 files: ['<%= config.app %>/styles/**/*.scss'],
  56.                 tasks: ['compass:server']
  57.             },
  58.             styles: {
  59.                 files: ['<%= config.app %>/styles/{,*/}*.css'],
  60.                 tasks: ['newer:copy:styles']
  61.             },
  62.             livereload: {
  63.                 options: {
  64.                     livereload: '<%= connect.options.livereload %>'
  65.                 },
  66.                 files: [
  67.                     '<%= config.app %>/{,**/}*.php',
  68.                     '.tmp/styles/{,*/}*.css',
  69.                     '<%= config.app %>/images/{,*/}*'
  70.                 ]
  71.             }
  72.         },
  73.  
  74.         // The actual grunt server settings
  75.         connect: {
  76.             options: {
  77.                 port: 9000,
  78.                 open: true,
  79.                 livereload: 35729,
  80.                 hostname: 'localhost',
  81.                 middleware: function(connect, options) {
  82.                     // Add PHP support to Connect
  83.                     var middlewares = [];
  84.                     var directory = options.directory || options.base[options.base.length - 1];
  85.                     if (!Array.isArray(options.base)) {
  86.                         options.base = [options.base];
  87.                     }
  88.                     middlewares.push(phpMiddleware(directory));
  89.                     options.base.forEach(function(base){
  90.                         middlewares.push(connect.static(base));
  91.                     });
  92.                     middlewares.push(connect.directory(directory));
  93.                     return middlewares;
  94.                 }
  95.             },
  96.             livereload: {
  97.                 options: {
  98.                     middleware: function(connect) {
  99.                         return [
  100.                             connect.static('.tmp'),
  101.                             connect().use('/bower_components', connect.static('./bower_components')),
  102.                             connect.static(config.app)
  103.                         ];
  104.                     }
  105.                 }
  106.             },
  107.             test: {
  108.                 options: {
  109.                     open: false,
  110.                     port: 9001,
  111.                     middleware: function(connect) {
  112.                         return [
  113.                             connect.static('.tmp'),
  114.                             connect.static('test'),
  115.                             connect().use('/bower_components', connect.static('./bower_components')),
  116.                             connect.static(config.app)
  117.                         ];
  118.                     }
  119.                 }
  120.             },
  121.             dist: {
  122.                 options: {
  123.                     base: '<%= config.dist %>',
  124.                     livereload: false
  125.                 }
  126.             }
  127.         },
  128.  
  129.         // Empties folders to start fresh
  130.         clean: {
  131.             dist: {
  132.                 files: [{
  133.                     dot: true,
  134.                     src: [
  135.                     '.tmp',
  136.                         '<%= config.dist %>/*',
  137.                         '!<%= config.dist %>/.git*'
  138.                     ]
  139.                 }]
  140.             },
  141.             server: '.tmp'
  142.         },
  143.  
  144.         // Make sure code styles are up to par and there are no obvious mistakes
  145.         jshint: {
  146.             options: {
  147.                 jshintrc: '.jshintrc',
  148.                 reporter: require('jshint-stylish')
  149.             },
  150.             all: [
  151.                 'Gruntfile.js',
  152.                 '<%= config.app %>/scripts/{,*/}*.js',
  153.                 '!<%= config.app %>/scripts/vendor/*',
  154.                 'test/spec/{,*/}*.js'
  155.             ]
  156.         },
  157.  
  158.         // Mocha testing framework configuration options
  159.         mocha: {
  160.             all: {
  161.                 options: {
  162.                     run: true,
  163.                     urls: ['http://<%= connect.test.options.hostname %>:<%= connect.test.options.port %>/index.html']
  164.                 }
  165.             }
  166.         },
  167.  
  168.         // Compiles Sass to CSS and generates necessary files if requested
  169.         // sass: {
  170.         //     options: {
  171.         //         sass: true,
  172.         //         includePaths: [
  173.         //             'bower_components'
  174.         //         ]
  175.         //     },
  176.         //     dist: {
  177.         //         files: [{
  178.         //             expand: true,
  179.         //             cwd: '<%= config.app %>/styles',
  180.         //             src: ['*.scss'],
  181.         //             dest: '.tmp/styles',
  182.         //             ext: '.css'
  183.         //         }]
  184.         //     },
  185.         //     server: {
  186.         //         files: [{
  187.         //             expand: true,
  188.         //             cwd: '<%= config.app %>/styles',
  189.         //             src: ['*.scss'],
  190.         //             dest: '.tmp/styles',
  191.         //             ext: '.css'
  192.         //         }]
  193.         //     }
  194.         // },
  195.          
  196.         compass: {
  197.           options: {
  198.             sassDir: '<%= config.app %>/styles',
  199.             cssDir: '.tmp/styles',
  200.             generatedImagesDir: '.tmp/images/generated',
  201.             imagesDir: '<%= config.app %>/images',
  202.             javascriptsDir: '<%= config.app %>/scripts',
  203.             fontsDir: '<%= config.app %>/fonts',
  204.             importPath: '<%= config.app %>/bower_components',
  205.             httpImagesPath: 'images',
  206.             httpGeneratedImagesPath: 'images/generated',
  207.             httpFontsPath: 'fonts',
  208.             relativeAssets: false,
  209.             assetCacheBuster: false,
  210.             raw: 'Sass::Script::Number.precision = 10\n'
  211.           },
  212.           dist: {
  213.             options: {
  214.               generatedImagesDir: '<%= config.dist %>/images/generated'
  215.             }
  216.           },
  217.           server: {
  218.             options: {
  219.               debugInfo: true
  220.             }
  221.           }
  222.         },
  223.  
  224.         // Automatically inject Bower components into the PHP files
  225.         bowerInstall: {
  226.             app: {
  227.                 src: ['<%= config.app %>/**/*.php'],
  228.                 exclude: ['bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap.js']
  229.             },
  230.             sass: {
  231.                 src: ['<%= config.app %>/styles/{,*/}*.{scss,sass}']
  232.             }
  233.         },
  234.  
  235.         // Renames files for browser caching purposes
  236.         rev: {
  237.             dist: {
  238.                 files: {
  239.                     src: [
  240.                         '<%= config.dist %>/scripts/{,*/}*.js',
  241.                         '<%= config.dist %>/styles/{,*/}*.css',
  242.                         '<%= config.dist %>/images/{,*/}*.*',
  243.                         '<%= config.dist %>/styles/fonts/{,*/}*.*',
  244.                         '<%= config.dist %>/*.{ico,png}'
  245.                     ]
  246.                 }
  247.             }
  248.         },
  249.  
  250.         // Reads HTML for usemin blocks to enable smart builds that automatically
  251.         // concat, minify and revision files. Creates configurations in memory so
  252.         // additional tasks can operate on them
  253.         useminPrepare: {
  254.             options: {
  255.                 dest: '<%= config.dist %>'
  256.             },
  257.             html: ['<%= config.app %>/**/*.php']
  258.         },
  259.  
  260.         // Performs rewrites based on rev and the useminPrepare configuration
  261.         usemin: {
  262.             options: {
  263.                 assetsDirs: ['<%= config.dist %>']
  264.             },
  265.             html: ['<%= config.dist %>/**/*.php'],
  266.             css: ['<%= config.dist %>/styles/{,*/}*.css']
  267.         },
  268.  
  269.         // The following *-min tasks produce minified files in the dist folder
  270.         imagemin: {
  271.             dist: {
  272.                 files: [{
  273.                     expand: true,
  274.                     cwd: '<%= config.app %>/images',
  275.                     src: '{,*/}*.{gif,jpeg,jpg,png}',
  276.                     dest: '<%= config.dist %>/images'
  277.                 }]
  278.             }
  279.         },
  280.  
  281.         svgmin: {
  282.             dist: {
  283.                 files: [{
  284.                     expand: true,
  285.                     cwd: '<%= config.app %>/images',
  286.                     src: '{,*/}*.svg',
  287.                     dest: '<%= config.dist %>/images'
  288.                 }]
  289.             }
  290.         },
  291.  
  292.         htmlmin: {
  293.             dist: {
  294.                 options: {
  295.                     collapseBooleanAttributes: true,
  296.                     collapseWhitespace: true,
  297.                     removeAttributeQuotes: true,
  298.                     removeCommentsFromCDATA: true,
  299.                     removeEmptyAttributes: true,
  300.                     removeOptionalTags: true,
  301.                     removeRedundantAttributes: true,
  302.                     useShortDoctype: true
  303.                 },
  304.                 files: [{
  305.                     expand: true,
  306.                     cwd: '<%= config.dist %>',
  307.                     src: '{,**/}*.php',
  308.                     dest: '<%= config.dist %>'
  309.                 }]
  310.             }
  311.         },
  312.  
  313.         // By default, your `index.html`'s <!-- Usemin block --> will take care of
  314.         // minification. These next options are pre-configured if you do not wish
  315.         // to use the Usemin blocks.
  316.         cssmin: {
  317.             dist: {
  318.                 files: {
  319.                     '<%= config.dist %>/styles/main.css': [
  320.                     '.tmp/styles/{,*/}*.css',
  321.                     '<%= config.app %>/styles/{,*/}*.css'
  322.                     ]
  323.                 }
  324.             }
  325.         },
  326.         // uglify: {
  327.         //     dist: {
  328.         //         files: {
  329.         //             '<%= config.dist %>/scripts/scripts.js': [
  330.         //                 '<%= config.dist %>/scripts/scripts.js'
  331.         //             ]
  332.         //         }
  333.         //     }
  334.         // },
  335.         // concat: {
  336.         //     dist: {}
  337.         // },
  338.  
  339.         // Copies remaining files to places other tasks can use
  340.         copy: {
  341.             dist: {
  342.                 files: [{
  343.                     expand: true,
  344.                     dot: true,
  345.                     cwd: '<%= config.app %>',
  346.                     dest: '<%= config.dist %>',
  347.                     src: [
  348.                         '*.{ico,png,txt,html}',
  349.                         '.htaccess',
  350.                         'images/{,*/}*.webp',
  351.                         'fonts/{,*/}*.*',
  352.                         'index.php',
  353.                         'includes/{,**/}*.php',
  354.                         'content/{,**/}*.php'
  355.                     ]
  356.                 }]
  357.             },
  358.             styles: {
  359.                 expand: true,
  360.                 // dot: true,
  361.                 cwd: '<%= config.app %>/styles',
  362.                 dest: '.tmp/styles/',
  363.                 src: '{,*/}*.css'
  364.             }
  365.         },
  366.  
  367.         // Generates a custom Modernizr build that includes only the tests you
  368.         // reference in your app
  369.         modernizr: {
  370.             dist: {
  371.                 devFile: '<%= config.app %>/bower_components/modernizr/modernizr.js',
  372.                 outputFile: '<%= config.dist %>/scripts/vendor/modernizr.js',
  373.                 files: {
  374.                     src: [
  375.                         '<%= config.dist %>/scripts/{,*/}*.js',
  376.                         '<%= config.dist %>/styles/{,*/}*.css',
  377.                         '!<%= config.dist %>/scripts/vendor/*'
  378.                     ]
  379.                 },
  380.                 uglify: true
  381.             }
  382.         },
  383.  
  384.         // Run some tasks in parallel to speed up build process
  385.         concurrent: {
  386.             server: [
  387.                 'compass:server'
  388.             ],
  389.             test: [
  390.                 'compass',
  391.             ],
  392.             dist: [
  393.                 'compass:dist',
  394.                 // 'copy:styles',
  395.                 'imagemin',
  396.                 'svgmin'
  397.             ]
  398.         }
  399.     });
  400.  
  401.     grunt.registerTask('serve', function (target) {
  402.         if (target === 'dist') {
  403.             return grunt.task.run(['build', 'connect:dist:keepalive']);
  404.         }
  405.  
  406.         grunt.task.run([
  407.             'clean:server',
  408.             'concurrent:server',
  409.             'connect:livereload',
  410.             'watch'
  411.         ]);
  412.     });
  413.  
  414.     grunt.registerTask('server', function (target) {
  415.         grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
  416.         grunt.task.run([target ? ('serve:' + target) : 'serve']);
  417.     });
  418.  
  419.     grunt.registerTask('test', function (target) {
  420.         if (target !== 'watch') {
  421.             grunt.task.run([
  422.                 'clean:server',
  423.                 'concurrent:test',
  424.             ]);
  425.         }
  426.  
  427.         grunt.task.run([
  428.             'connect:test',
  429.             'mocha'
  430.         ]);
  431.     });
  432.  
  433.     grunt.registerTask('build', [
  434.         'clean:dist',
  435.         'useminPrepare',
  436.         'concurrent:dist',
  437.         'concat',
  438.         'copy:dist',
  439.         'cssmin',
  440.         'uglify',
  441.         'modernizr',
  442.         'usemin'
  443.     ]);
  444.  
  445.     grunt.registerTask('default', [
  446.         'newer:jshint',
  447.         'test',
  448.         'build'
  449.     ]);
  450. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement