From 4f620ac9b115d52d4d0ed11706dab976d2944e06 Mon Sep 17 00:00:00 2001 From: Nicolas Escalante Date: Mon, 29 May 2017 16:15:02 -0300 Subject: [PATCH] add tokens to processCss function --- README.md | 3 ++- lib/attachHook.js | 3 ++- lib/index.js | 47 +++++++++++++++++++++++++++++++---------------- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 505ec8e..bae7a24 100644 --- a/README.md +++ b/README.md @@ -187,8 +187,9 @@ hook({ /** * @param {string} css * @param {string} filepath Absolute path to the file + * @param {object} tokens */ - processCss: function (css, filepath) { /* */ } + processCss: function (css, filepath, tokens) { /* */ } }); ``` diff --git a/lib/attachHook.js b/lib/attachHook.js index 1ea95f5..d5dc417 100644 --- a/lib/attachHook.js +++ b/lib/attachHook.js @@ -13,7 +13,8 @@ module.exports = function attachHook(compile, extension, isException) { existingHook(m, filename); } else { const tokens = compile(filename); - return m._compile(`module.exports = ${JSON.stringify(tokens)}`, filename); + + m.exports = tokens; } }; }; diff --git a/lib/index.js b/lib/index.js index 43dacc4..4c14794 100644 --- a/lib/index.js +++ b/lib/index.js @@ -40,7 +40,7 @@ module.exports = function setupHook({ debugSetup(arguments[0]); validate(arguments[0]); - const tokensByFile = {}; + const resultsByFile = {}; // debug option is preferred NODE_ENV === 'development' const debugMode = typeof devMode !== 'undefined' @@ -76,58 +76,73 @@ module.exports = function setupHook({ const runner = postcss(plugins); /** - * @todo think about replacing sequential fetch function calls with requires calls * @param {string} _to * @param {string} from * @return {object} */ function fetch(_to, from) { + return runProcess(_to, from).tokens; + } + + /** + * @param {string} _to + * @param {string} from + * @return {object} + */ + function runProcess(_to, from) { // getting absolute path to the processing file const filename = /[^\\/?%*:|"<>\.]/i.test(_to[0]) ? require.resolve(_to) : resolve(dirname(from), _to); // checking cache - let tokens = tokensByFile[filename]; - if (tokens) { + let results = resultsByFile[filename]; + if (results) { debugFetch(`${filename} → cache`); - debugFetch(tokens); - return tokens; + debugFetch(results.tokens); + return results; } const source = preprocessCss(readFileSync(filename, 'utf8'), filename); // https://github.com/postcss/postcss/blob/master/docs/api.md#processorprocesscss-opts const lazyResult = runner.process(source, assign({}, processorOpts, {from: filename})); + const css = lazyResult.css; // https://github.com/postcss/postcss/blob/master/docs/api.md#lazywarnings lazyResult.warnings().forEach(message => console.warn(message.text)); - tokens = lazyResult.root.tokens; + results = { + tokens: lazyResult.root.tokens, + css: lazyResult.css, + filename + }; if (!debugMode) { // updating cache - tokensByFile[filename] = tokens; + resultsByFile[filename] = results; } else { // clearing cache in development mode delete require.cache[filename]; } - if (processCss) { - processCss(lazyResult.css, filename); - } - debugFetch(`${filename} → fs`); - debugFetch(tokens); + debugFetch(results.tokens); - return tokens; + return results; }; const exts = toArray(extensions); const isException = buildExceptionChecker(ignore); const hook = filename => { - const tokens = fetch(filename, filename); - return camelCase ? transformTokens(tokens, camelCase) : tokens; + const lazyResult = runProcess(filename, filename); + let tokens = camelCase ? transformTokens(lazyResult.tokens, camelCase) : lazyResult.tokens; + + if (processCss) { + processCss(lazyResult.css, lazyResult.filename, tokens); + } + + return tokens; }; // @todo add possibility to specify particular config for each extension