diff options
Diffstat (limited to 'node_modules/csso/lib/index.js')
| -rw-r--r-- | node_modules/csso/lib/index.js | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/node_modules/csso/lib/index.js b/node_modules/csso/lib/index.js new file mode 100644 index 00000000..e2620280 --- /dev/null +++ b/node_modules/csso/lib/index.js @@ -0,0 +1,156 @@ +var parse = require('./parser'); +var compress = require('./compressor'); +var translate = require('./utils/translate'); +var translateWithSourceMap = require('./utils/translateWithSourceMap'); +var walkers = require('./utils/walk'); +var clone = require('./utils/clone'); +var List = require('./utils/list'); + +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 = translate(ast, true); + + // 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) + ); + } + + // translate + if (options.sourceMap) { + result = debugOutput('translateWithSourceMap', options, Date.now(), (function() { + var tmp = translateWithSourceMap(compressResult.ast); + 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('translate', options, Date.now(), { + css: translate(compressResult.ast), + map: null + }); + } + + return result; +} + +function minifyStylesheet(source, options) { + return minify('stylesheet', source, options); +}; + +function minifyBlock(source, options) { + return minify('block', source, options); +} + +module.exports = { + version: require('../package.json').version, + + // classes + List: List, + + // main methods + minify: minifyStylesheet, + minifyBlock: minifyBlock, + + // step by step + parse: parse, + compress: compress, + translate: translate, + translateWithSourceMap: translateWithSourceMap, + + // walkers + walk: walkers.all, + walkRules: walkers.rules, + walkRulesRight: walkers.rulesRight, + + // utils + clone: clone +}; |
