Advertisement
Aluf

Gruntfile.js

Jan 24th, 2015
274
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*!
  2.  * Ratchet's Gruntfile
  3.  * http://goratchet.com
  4.  * Copyright 2014 Connor Sears
  5.  * Licensed under MIT (https://github.com/twbs/ratchet/blob/master/LICENSE)
  6.  */
  7.  
  8. /* jshint node: true */
  9. module.exports = function (grunt) {
  10.   'use strict';
  11.  
  12.   // Force use of Unix newlines
  13.   grunt.util.linefeed = '\n';
  14.  
  15.   RegExp.quote = function (string) {
  16.     return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&');
  17.   };
  18.  
  19.   var generateRatchiconsData = require('./grunt/ratchicons-data-generator.js');
  20.  
  21.   // Project configuration.
  22.   grunt.initConfig({
  23.     pkg: grunt.file.readJSON('package.json'),
  24.  
  25.     // Metadata.
  26.     meta: {
  27.       srcPath:        'sass/',
  28.       distPath:       'dist/',
  29.       docsPath:       'docs/dist/',
  30.       docsAssetsPath: 'docs/assets/'
  31.     },
  32.  
  33.     banner: '/*!\n' +
  34.             ' * =====================================================\n' +
  35.             ' * Ratchet v<%= pkg.version %> (<%= pkg.homepage %>)\n' +
  36.             ' * Copyright <%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
  37.             ' * Licensed under <%= pkg.license %> (https://github.com/twbs/ratchet/blob/master/LICENSE)\n' +
  38.             ' *\n' +
  39.             ' * v<%= pkg.version %> designed by @connors.\n' +
  40.             ' * =====================================================\n' +
  41.             ' */\n',
  42.  
  43.     clean: {
  44.       dist: ['<%= meta.distPath %>', '<%= meta.docsPath %>']
  45.     },
  46.  
  47.     concat: {
  48.       ratchet: {
  49.         options: {
  50.           banner: '<%= banner %>'
  51.         },
  52.         src: [
  53.           'js/modals.js',
  54.           'js/popovers.js',
  55.           'js/push.js',
  56.           'js/segmented-controllers.js',
  57.           'js/sliders.js',
  58.           'js/toggles.js'
  59.         ],
  60.         dest: '<%= meta.distPath %>js/<%= pkg.name %>.js'
  61.       }
  62.     },
  63.  
  64.     sass: {
  65.       options: {
  66.         banner: '<%= banner %>',
  67.         sourcemap: 'none',
  68.         style: 'expanded',
  69.         unixNewlines: true
  70.       },
  71.       dist: {
  72.         files: {
  73.           '<%= meta.distPath %>css/<%= pkg.name %>.css': 'sass/ratchet.scss',
  74.           '<%= meta.distPath %>css/<%= pkg.name %>-theme-ios.css': 'sass/theme-ios.scss',
  75.           '<%= meta.distPath %>css/<%= pkg.name %>-theme-android.css': 'sass/theme-android.scss',
  76.           '<%= meta.docsAssetsPath %>css/docs.css': 'sass/docs.scss'
  77.         }
  78.       }
  79.     },
  80.  
  81.     csscomb: {
  82.       options: {
  83.         config: 'sass/.csscomb.json'
  84.       },
  85.       dist: {
  86.         files: {
  87.           '<%= meta.distPath %>css/<%= pkg.name %>.css': '<%= meta.distPath %>css/<%= pkg.name %>.css',
  88.           '<%= meta.distPath %>css/<%= pkg.name %>-theme-android.css': '<%= meta.distPath %>css/<%= pkg.name %>-theme-android.css',
  89.           '<%= meta.distPath %>css/<%= pkg.name %>-theme-ios.css': '<%= meta.distPath %>css/<%= pkg.name %>-theme-ios.css'
  90.         }
  91.       },
  92.       docs: {
  93.         files: {
  94.           '<%= meta.docsAssetsPath %>css/docs.css': '<%= meta.docsAssetsPath %>css/docs.css'
  95.         }
  96.       }
  97.     },
  98.  
  99.     copy: {
  100.       fonts: {
  101.         expand: true,
  102.         src: 'fonts/*',
  103.         dest: '<%= meta.distPath %>'
  104.       },
  105.       docs: {
  106.         expand: true,
  107.         cwd: '<%= meta.distPath %>',
  108.         src: [
  109.           '**/*'
  110.         ],
  111.         dest: '<%= meta.docsPath %>'
  112.       }
  113.     },
  114.  
  115.     cssmin: {
  116.       options: {
  117.         keepSpecialComments: '*' // set to '*' because we already add the banner in sass
  118.       },
  119.       ratchet: {
  120.         src: '<%= meta.distPath %>css/<%= pkg.name %>.css',
  121.         dest: '<%= meta.distPath %>css/<%= pkg.name %>.min.css'
  122.       },
  123.       theme: {
  124.         files: {
  125.           '<%= meta.distPath %>css/<%= pkg.name %>-theme-ios.min.css': '<%= meta.distPath %>css/<%= pkg.name %>-theme-ios.css',
  126.           '<%= meta.distPath %>css/<%= pkg.name %>-theme-android.min.css': '<%= meta.distPath %>css/<%= pkg.name %>-theme-android.css'
  127.         }
  128.       },
  129.       docs: {
  130.         src: [
  131.           '<%= meta.docsAssetsPath %>css/docs.css',
  132.           '<%= meta.docsAssetsPath %>css/pygments-manni.css'
  133.         ],
  134.         dest: '<%= meta.docsAssetsPath %>css/docs.min.css'
  135.       }
  136.     },
  137.  
  138.     uglify: {
  139.       options: {
  140.         banner: '<%= banner %>',
  141.         compress: true,
  142.         mangle: true,
  143.         preserveComments: false
  144.       },
  145.       ratchet: {
  146.         src: '<%= concat.ratchet.dest %>',
  147.         dest: '<%= meta.distPath %>js/<%= pkg.name %>.min.js'
  148.       },
  149.       docs: {
  150.         src: [
  151.           '<%= meta.docsAssetsPath %>js/docs.js',
  152.           '<%= meta.docsAssetsPath %>js/fingerblast.js'
  153.         ],
  154.         dest: '<%= meta.docsAssetsPath %>js/docs.min.js'
  155.       }
  156.     },
  157.  
  158.     watch: {
  159.       scripts: {
  160.         files: [
  161.           '<%= meta.srcPath %>**/*.scss'
  162.         ],
  163.         tasks: ['sass']
  164.       }
  165.     },
  166.  
  167.     jekyll: {
  168.       docs: {}
  169.     },
  170.  
  171.     jshint: {
  172.       options: {
  173.         jshintrc: 'js/.jshintrc'
  174.       },
  175.       grunt: {
  176.         src: ['Gruntfile.js', 'grunt/*.js']
  177.       },
  178.       src: {
  179.         src: 'js/*.js'
  180.       },
  181.       docs: {
  182.         src: ['<%= meta.docsAssetsPath %>/js/docs.js', '<%= meta.docsAssetsPath %>/js/fingerblast.js']
  183.       }
  184.     },
  185.  
  186.     jscs: {
  187.       options: {
  188.         config: 'js/.jscsrc'
  189.       },
  190.       grunt: {
  191.         src: '<%= jshint.grunt.src %>'
  192.       },
  193.       src: {
  194.         src: '<%= jshint.src.src %>'
  195.       },
  196.       docs: {
  197.         src: '<%= jshint.docs.src %>'
  198.       }
  199.     },
  200.  
  201.     csslint: {
  202.       options: {
  203.         csslintrc: 'sass/.csslintrc'
  204.       },
  205.       src: [
  206.         '<%= meta.distPath %>/css/<%= pkg.name %>.css',
  207.         '<%= meta.distPath %>/css/<%= pkg.name %>-theme-android.css',
  208.         '<%= meta.distPath %>/css/<%= pkg.name %>-theme-ios.css'
  209.       ],
  210.       docs: {
  211.         options: {
  212.           ids: false
  213.         },
  214.         src: ['<%= meta.docsAssetsPath %>/css/docs.css']
  215.       }
  216.     },
  217.  
  218.     validation: {
  219.       options: {
  220.         charset: 'utf-8',
  221.         doctype: 'HTML5',
  222.         failHard: true,
  223.         reset: true,
  224.         relaxerror: [
  225.           'Attribute ontouchstart not allowed on element body at this point.',
  226.           'Bad value X-UA-Compatible for attribute http-equiv on element meta.',
  227.           'Consider using the h1 element as a top-level heading only \\(all h1 elements are treated as top-level headings by many screen readers and other tools\\)\\.'
  228.         ]
  229.       },
  230.       files: {
  231.         src: '_site/**/*.html'
  232.       }
  233.     },
  234.  
  235.     sed: {
  236.       versionNumber: {
  237.         pattern: (function () {
  238.           var old = grunt.option('oldver');
  239.           return old ? RegExp.quote(old) : old;
  240.         })(),
  241.         replacement: grunt.option('newver'),
  242.         recursive: true
  243.       }
  244.     }
  245.   });
  246.  
  247.   // Load the plugins
  248.   require('load-grunt-tasks')(grunt, { scope: 'devDependencies' });
  249.   require('time-grunt')(grunt);
  250.  
  251.   // Default task(s).
  252.   grunt.registerTask('dist-css', ['sass', 'csscomb', 'cssmin']);
  253.   grunt.registerTask('dist-js', ['concat', 'uglify']);
  254.   grunt.registerTask('dist', ['clean', 'dist-css', 'dist-js', 'copy', 'build-ratchicons-data']);
  255.   grunt.registerTask('validate-html', ['jekyll', 'validation']);
  256.   grunt.registerTask('build', ['dist']);
  257.   grunt.registerTask('default', ['dist']);
  258.   grunt.registerTask('test', ['dist', 'csslint', 'jshint', 'jscs', 'validate-html']);
  259.  
  260.   grunt.registerTask('build-ratchicons-data', generateRatchiconsData);
  261.  
  262.   // Version numbering task.
  263.   // grunt change-version-number --oldver=A.B.C --newver=X.Y.Z
  264.   // This can be overzealous, so its changes should always be manually reviewed!
  265.   grunt.registerTask('change-version-number', 'sed');
  266. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement