123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- var fs = require('fs');
- module.exports = function(grunt) {
- grunt.initConfig({
- less: {
- build: {
- options: {},
- files: {
- 'dist/waves.css': 'src/less/waves.less'
- }
- },
- minified: {
- options: {
- cleancss:true
- },
- files: {
- 'dist/waves.min.css': 'src/less/waves.less'
- }
- },
- // re-minify everything in tests/ so that they all
- // have the same minification for comparision
- test: {
- options: {
- cleancss:true,
- cleancssOptions: {
- keepSpecialComments:'0'
- }
- },
- files: {
- 'tests/less/waves.min.css': 'src/less/waves.less',
- 'tests/sass/waves.min.css': 'tests/sass/waves.css',
- 'tests/scss/waves.min.css': 'tests/scss/waves.css',
- 'tests/stylus/waves.min.css': 'tests/stylus/waves.css'
- }
- }
- },
-
- jshint: {
-
- files: [
- 'gruntfile.js',
- 'src/js/*.js',
- ],
-
- options: {
- globals: {
- console: true
- }
- }
- },
-
- uglify: {
- options: {
- mangle: true, // false when debugging
- compress: true, // false when debugging
- sourceMap: true,
- sourceMapName: 'dist/waves.min.js.map',
- preserveComments: 'some'
- },
- js: {
- files: {
- 'dist/waves.min.js': ['src/js/waves.js']
- }
- }
- },
- // Copy to dist
- copy: {
- js: {
- expand: true,
- cwd: 'src/js',
- src: 'waves.js',
- dest: 'dist/'
- },
- docs: {
- expand: true,
- cwd: 'dist',
- src: ['waves.min.css', 'waves.min.js'],
- dest: 'docs/static'
- }
- },
-
- //convert less to stylus
- execute: {
- less2stylus: {
- call: function(grunt, options, async) {
- var done = async();
- var exec = require('child_process').exec;
- exec('cd node_modules/less2stylus && ./less2stylus ../../src/less/waves.less', function (error, stdout, stderr) {
- grunt.log.writeln('Executing less2styus...');
- if (error) {
- grunt.log.writeln('Error! ' + error);
- }
- var fs = require('fs');
- fs.writeFile("src/stylus/waves.styl", stdout, function(err) {
- if(err) {
- grunt.log.writeln(err);
- } else {
- grunt.log.writeln("Stylus file was saved!");
- }
- done(); // let grunt resume
- });
- });
- }
- },
- less2scss: {
- //FUTURE: Put less2scss as it's own script
- call: function(grunt, options, async) {
- var done = async();
- var text = fs.readFileSync('src/less/waves.less', {encoding:'utf8'});
- //replace @ with $
- text = text.replace(/@(?!import|media|keyframes|-)/g, '$');
- //replace mixins
- text = text.replace(/\.([\w\-]*)\s*\((.*)\)\s*\{/g, '@mixin $1($2){');
- //replace includes
- text = text.replace(/\.([\w\-]*\(.*\)\s*;)/g, '@include $1');
- //replace string literals
- //eg. ~'!important' -> #{"!important"}
- text = text.replace(/~(?:\"|\')(.*)(?:\"|\')/g, '#{"$1"}');
- //NOTE: for true less->scss transpiling we'd need to replace spin to adjust-hue (not needed but anyway)
- fs.writeFileSync('src/scss/waves.scss', text);
- done();
- }
- },
-
- test: {
- call: function(grunt, options, async) {
- var done = async();
- var lessTest = fs.readFileSync('tests/less/waves.min.css', {encoding:'utf8'});
- var sassTest = fs.readFileSync('tests/sass/waves.min.css', {encoding:'utf8'});
- var scssTest = fs.readFileSync('tests/scss/waves.min.css', {encoding:'utf8'});
- var stylusTest = fs.readFileSync('tests/stylus/waves.min.css', {encoding:'utf8'});
-
- var failure = false;
- if (lessTest != sassTest) {
- grunt.log.writeln('ERROR: sass failed test.');
- failure = true;
- }
-
- if (lessTest != scssTest) {
- grunt.log.writeln('ERROR: scss failed test.');
- failure = true;
- }
-
- if (lessTest != stylusTest) {
- grunt.log.writeln('ERROR: stylus failed test.');
- failure = true;
- }
-
- if (sassTest != scssTest) {
- grunt.log.writeln('WARNING: sass files aren\'t equal?');
- failure = true;
- }
-
- if (!failure) grunt.log.writeln('PASS: conversions generated same CSS');
-
- done();
- }
- }
- },
- 'sass-convert': {
- options: {
- from: 'scss',
- to: 'sass',
- indent: 2
- },
- files: {
- cwd: 'src/scss',
- src: '*.scss',
- dest: 'src/sass'
- }
- },
-
- sass: {
- test: {
- files: [{
- expand: true,
- cwd: 'src',
- src: ['**/*.sass', '**/*.scss'],
- dest: 'tests/',
- ext: '.css'
- }]
- }
- },
-
- stylus: {
- test: {
- files: {
- 'tests/stylus/waves.css': 'src/stylus/waves.styl'
- }
- }
- },
-
- clean: {
- test: ['tests/*']
- },
- watch: {
- script: {
- options: {
- spawn: false,
- event: ['added', 'deleted', 'changed']
- },
- files: ['src/**/*.js', 'src/**/*.less'],
- tasks: ['build']
- },
- grunt: {
- files: ['Gruntfile.js']
- }
- }
- });
-
- // Load module
- grunt.loadNpmTasks('grunt-contrib-concat');
- grunt.loadNpmTasks('grunt-contrib-less');
- grunt.loadNpmTasks('grunt-contrib-jshint');
- grunt.loadNpmTasks('grunt-contrib-uglify');
- grunt.loadNpmTasks('grunt-contrib-copy');
- grunt.loadNpmTasks('grunt-contrib-watch');
- grunt.loadNpmTasks('grunt-contrib-sass');
- grunt.loadNpmTasks('grunt-contrib-stylus');
- grunt.loadNpmTasks('grunt-execute');
- grunt.loadNpmTasks('grunt-sass-convert');
- grunt.loadNpmTasks('grunt-contrib-clean');
-
- // Create grunt task
- grunt.registerTask('build', [
- 'less:build',
- 'less:minified',
- 'jshint',
- 'uglify',
- 'copy',
- 'execute:less2stylus',
- 'execute:less2scss',
- 'sass-convert',
- 'sass:test',
- 'stylus:test',
- 'less:test',
- 'execute:test',
- 'clean:test'
- ]);
-
- grunt.registerTask('default', ['build', 'watch']);
- };
|