Skip to content

Commit

Permalink
WIP extraction result aggregation
Browse files Browse the repository at this point in the history
  • Loading branch information
jgranstrom committed Jan 23, 2017
1 parent ed5b7db commit 648604e
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 13 deletions.
32 changes: 30 additions & 2 deletions extract.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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
Expand Down
19 changes: 9 additions & 10 deletions inject.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 };
}
Expand All @@ -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;
});
Expand Down
3 changes: 2 additions & 1 deletion test2.scss
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
$b: $a * 2;
$b: $a * 2;
$a: 3px;

0 comments on commit 648604e

Please sign in to comment.