diff --git a/extract.js b/extract.js index a3ff5ec..61413de 100644 --- a/extract.js +++ b/extract.js @@ -15,8 +15,12 @@ exports.extractSync = (rendered, { compileOptions = {} } = {}) => { const declarations = parseDeclarations(includedData); const variableResults = {}; - const declarationResultHandler = (declaration, value) => { - variableResults[declaration.declaration] = value; + const declarationResultHandler = (context, declaration, value) => { + if(!variableResults[context]) { + variableResults[context] = {}; + } + + variableResults[context][declaration.declaration] = { value, expression: declaration.expression }; } const injection = injectFunctions(filename, includedData, declarations, declarationResultHandler); @@ -48,6 +52,30 @@ exports.extractSync = (rendered, { compileOptions = {} } = {}) => { console.log('extractionMap', require('util').inspect(extractionMap, { depth: null })); + const extractedVariables = {}; + + Object.keys(extractionMap).map(filename => { + Object.keys(extractionMap[filename].variableResults).map(variableContext => { + Object.keys(extractionMap[filename].variableResults[variableContext]).map(variableKey => { + if(!extractedVariables[variableContext]) { + extractedVariables[variableContext] = {}; + } + + if(!extractedVariables[variableContext][variableKey]) { + extractedVariables[variableContext][variableKey] = Object.assign({}, extractionMap[filename].variableResults[variableContext][variableKey].value); + + extractedVariables[variableContext][variableKey].sources = []; + extractedVariables[variableContext][variableKey].expressions = []; + } + + extractedVariables[variableContext][variableKey].sources.push(filename); + extractedVariables[variableContext][variableKey].expressions.push(extractionMap[filename].variableResults[variableContext][variableKey].expression); + }); + }); + }); + + console.log('extraction is', require('util').inspect(extractedVariables, { depth: null })); + // TODO: Globals overwrite eachother so it is possible to just keep a global result object with just one key per variable extracted and the value // Don't have to worry about which file it's from, Maybe just include an array of sources: [] for each file referencing / declaring the variable, // might have to do the same for expressions as they may differ diff --git a/inject.js b/inject.js index c9eb743..4ef2f42 100644 --- a/inject.js +++ b/inject.js @@ -51,28 +51,27 @@ function makeValue(sassValue) { } } -function createStructuredValue(sassValue, sourceValue) { +function createStructuredValue(sassValue) { const value = makeValue(sassValue); if(value) { value.type = sassValue.constructor.name; - value.source = sourceValue.getValue(); } return value; } -function inject(filename, fnPrefix, declaration, declarationResultHandler) { +function inject(context, filename, fnPrefix, declaration, declarationResultHandler) { const fileId = new Buffer(filename).toString('base64').replace(/=/g, ''); - const fnName = `${fileId}_${FN_PREFIX}${fnPrefix}${declaration.declarationClean}`; + const fnName = `${fileId}_${context}_${FN_PREFIX}${fnPrefix}${declaration.declarationClean}`; - const injectedFunction = (sassValue, sourceValue) => { - const value = createStructuredValue(sassValue, sourceValue); - declarationResultHandler(declaration, value, sassValue); + const injectedFunction = (sassValue) => { + const value = createStructuredValue(sassValue); + declarationResultHandler(context, declaration, value, sassValue); return sassValue; }; - const injectedCode = `$${fnName}${FN_SUFFIX_VALUE}: ${fnName}(${declaration.declaration}, '${filename}');\n` + const injectedCode = `$${fnName}${FN_SUFFIX_VALUE}: ${fnName}(${declaration.declaration});\n` return { fnName, injectedFunction, injectedCode }; } @@ -82,13 +81,13 @@ exports.injectFunctions = (filename, data, declarations, declarationResultHandle const injectedFunctions = {}; declarations.implicitGlobals.forEach((declaration) => { - const { fnName, injectedFunction, injectedCode } = inject(filename, FN_PREFIX_IMPLICIT_GLOBAL, declaration, declarationResultHandler); + const { fnName, injectedFunction, injectedCode } = inject('global', filename, FN_PREFIX_IMPLICIT_GLOBAL, declaration, declarationResultHandler); injectedFunctions[fnName] = injectedFunction; injectedData += injectedCode; }); declarations.explicitGlobals.forEach((declaration) => { - const { fnName, injectedFunction, injectedCode } = inject(filename, FN_PREFIX_EXPLICIT_GLOBAL, declaration, declarationResultHandler); + const { fnName, injectedFunction, injectedCode } = inject('global', filename, FN_PREFIX_EXPLICIT_GLOBAL, declaration, declarationResultHandler); injectedFunctions[fnName] = injectedFunction; injectedData += injectedCode; }); diff --git a/test2.scss b/test2.scss index 60caed7..6588a77 100644 --- a/test2.scss +++ b/test2.scss @@ -1 +1,2 @@ -$b: $a * 2; \ No newline at end of file +$b: $a * 2; +$a: 3px; \ No newline at end of file