1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- 'use strict';
- var path = require('path');
- var util = require('util');
- var CleanCSS = require('clean-css');
- var chalk = require('chalk');
- var maxmin = require('maxmin');
- module.exports = function (grunt) {
- var getAvailableFiles = function (filesArray) {
- return filesArray.filter(function (filepath) {
- if (!grunt.file.exists(filepath)) {
- grunt.log.warn('Source file ' + chalk.cyan(filepath) + ' not found');
- return false;
- }
- return true;
- });
- };
- grunt.registerMultiTask('cssmin', 'Minify CSS', function () {
- var created = {
- maps: 0,
- files: 0
- };
- var size = {
- before: 0,
- after: 0
- };
- this.files.forEach(function (file) {
- var options = this.options({
- rebase: false,
- report: 'min',
- sourceMap: false
- });
- var availableFiles = getAvailableFiles(file.src);
- var compiled = '';
- options.target = file.dest;
- options.relativeTo = path.dirname(availableFiles[0]);
- try {
- compiled = new CleanCSS(options).minify(availableFiles);
- if (compiled.errors.length) {
- grunt.warn(compiled.errors.toString());
- return;
- }
- if (compiled.warnings.length) {
- grunt.log.error(compiled.warnings.toString());
- }
- if (options.debug) {
- grunt.log.writeln(util.format(compiled.stats));
- }
- } catch (err) {
- grunt.log.error(err);
- grunt.warn('CSS minification failed at ' + availableFiles + '.');
- }
- var compiledCssString = compiled.styles;
- var unCompiledCssString = availableFiles.map(function (file) {
- return grunt.file.read(file);
- }).join('');
- size.before += unCompiledCssString.length;
- if (options.sourceMap) {
- compiledCssString += '\n' + '/*# sourceMappingURL=' + path.basename(file.dest) + '.map */';
- grunt.file.write(file.dest + '.map', compiled.sourceMap.toString());
- created.maps++;
- grunt.verbose.writeln('File ' + chalk.cyan(file.dest + '.map') + ' created');
- }
- grunt.file.write(file.dest, compiledCssString);
- created.files++;
- size.after += compiledCssString.length;
- grunt.verbose.writeln('File ' + chalk.cyan(file.dest) + ' created ' + chalk.dim(maxmin(unCompiledCssString, compiledCssString, options.report === 'gzip')));
- }, this);
- if (created.maps > 0) {
- grunt.log.ok(created.maps + ' source' + grunt.util.pluralize(this.files.length, 'map/maps') + ' created.');
- }
- if (created.files > 0) {
- grunt.log.ok(created.files + ' ' + grunt.util.pluralize(this.files.length, 'file/files') + ' created. ' + chalk.dim(maxmin(size.before, size.after)));
- } else {
- grunt.log.warn('No files created.');
- }
- });
- };
|