| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 | var csstree = require('css-tree');var parse = csstree.parse;var compress = require('./compress');var generate = csstree.generate;function debugOutput(name, options, startTime, data) {    if (options.debug) {        console.error('## ' + name + ' done in %d ms\n', Date.now() - startTime);    }    return data;}function createDefaultLogger(level) {    var lastDebug;    return function logger(title, ast) {        var line = title;        if (ast) {            line = '[' + ((Date.now() - lastDebug) / 1000).toFixed(3) + 's] ' + line;        }        if (level > 1 && ast) {            var css = generate(ast);            // when level 2, limit css to 256 symbols            if (level === 2 && css.length > 256) {                css = css.substr(0, 256) + '...';            }            line += '\n  ' + css + '\n';        }        console.error(line);        lastDebug = Date.now();    };}function copy(obj) {    var result = {};    for (var key in obj) {        result[key] = obj[key];    }    return result;}function buildCompressOptions(options) {    options = copy(options);    if (typeof options.logger !== 'function' && options.debug) {        options.logger = createDefaultLogger(options.debug);    }    return options;}function runHandler(ast, options, handlers) {    if (!Array.isArray(handlers)) {        handlers = [handlers];    }    handlers.forEach(function(fn) {        fn(ast, options);    });}function minify(context, source, options) {    options = options || {};    var filename = options.filename || '<unknown>';    var result;    // parse    var ast = debugOutput('parsing', options, Date.now(),        parse(source, {            context: context,            filename: filename,            positions: Boolean(options.sourceMap)        })    );    // before compress handlers    if (options.beforeCompress) {        debugOutput('beforeCompress', options, Date.now(),            runHandler(ast, options, options.beforeCompress)        );    }    // compress    var compressResult = debugOutput('compress', options, Date.now(),        compress(ast, buildCompressOptions(options))    );    // after compress handlers    if (options.afterCompress) {        debugOutput('afterCompress', options, Date.now(),            runHandler(compressResult, options, options.afterCompress)        );    }    // generate    if (options.sourceMap) {        result = debugOutput('generate(sourceMap: true)', options, Date.now(), (function() {            var tmp = generate(compressResult.ast, { sourceMap: true });            tmp.map._file = filename; // since other tools can relay on file in source map transform chain            tmp.map.setSourceContent(filename, source);            return tmp;        }()));    } else {        result = debugOutput('generate', options, Date.now(), {            css: generate(compressResult.ast),            map: null        });    }    return result;}function minifyStylesheet(source, options) {    return minify('stylesheet', source, options);}function minifyBlock(source, options) {    return minify('declarationList', source, options);}module.exports = {    version: require('../package.json').version,    // main methods    minify: minifyStylesheet,    minifyBlock: minifyBlock,    // css syntax parser/walkers/generator/etc    syntax: Object.assign({        compress: compress    }, csstree)};
 |