bjork24/tate

View on GitHub
lib/parser.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict';

var sass = require('node-sass');
var less = require('less');
var stylus = require('stylus');
var path = require('path');
var _ = require('lodash');
var prettyBytes = require('pretty-bytes');
var gzipSize = require('gzip-size');
var u = require('./utils');
var CleanCSS = require('clean-css');
var asyncblock = require('asyncblock');

module.exports = {

  it: function(){
    var self = this;
    _.forEach(global.tate.data, function(n, file){
      var ext = path.extname(file).replace('.','');
      self[ext](file);
    });
  },

  styl: function(file){
    var self = this;
    asyncblock(function(flow){
      var rawSTYL = u.read(file);
      var stylOpts = {
        filename: path.resolve(file)
      };
      var compiled = flow.sync( stylus.render(rawSTYL, stylOpts, flow.callback()) );
      self.parseCSS(compiled, file);
    });
  },

  sass: function(file){
    var compiled = sass.renderSync({ file: file });
    this.parseCSS(compiled.css, file, compiled.stats.includedFiles);
  },

  scss: function(file){ this.sass(file); },

  less: function(file){
    var self = this;
    asyncblock(function(flow){
      var rawLESS = u.read(file);
      var lessOpts = {
        isSync: true,
        syncImport: true,
        filename: path.resolve(file)
      };
      var compiled = flow.sync( less.render(rawLESS, lessOpts, flow.callback()) );
      self.parseCSS(compiled.css, file, compiled.imports);
    });
  },

  css: function(file){
    var rawCSS = u.read(file);
    this.parseCSS(rawCSS, file);
  },

  parseCSS: function(rawCSS, file, includedFiles){
    includedFiles = ( u.is.undefined(includedFiles) ) ? false : includedFiles ; 
    rawCSS = rawCSS.replace(/\r\n/g, '\n');
    var compiledCSS = new CleanCSS().minify(rawCSS).styles;
    _.extend(global.tate.data[file], {
      css: rawCSS,
      size: {
        full: ( rawCSS.length ) ? prettyBytes(rawCSS.length) : 0 ,
        mini: ( compiledCSS.length ) ? prettyBytes(compiledCSS.length) : 0 ,
        gzip: ( compiledCSS.length ) ? prettyBytes(gzipSize.sync(compiledCSS)) : 0
      }
    });
    if ( includedFiles ) {
      _.chain(includedFiles)
      .map(function(path){ return path.replace(process.cwd() + '/',''); })
      .pull(file)
      .value()
      .forEach(function(importedFile){
        if ( _.has(global.tate.data[importedFile], 'importedBy') ) {
          global.tate.data[importedFile].importedBy.push(file);
        } else {
          _.extend(global.tate.data[importedFile], { importedBy: [file]});
        }
      });
    }
  }

};