Skip to content

Commit

Permalink
fix(extract): fixes undefined ordering behavior on extraction
Browse files Browse the repository at this point in the history
fixes #13
  • Loading branch information
jgranstrom committed Aug 15, 2017
1 parent 023ca1b commit bb0c34c
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 18 deletions.
30 changes: 16 additions & 14 deletions src/extract.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,24 +44,26 @@ function makeExtractionCompileOptions(compileOptions, entryFilename, extractions
/**
* Compile extracted variables per file into a complete result object
*/
function compileExtractionResult(extractions) {
function compileExtractionResult(orderedFiles, extractions) {
const extractedVariables = { global: {} };

Object.keys(extractions).map(filename => {
orderedFiles.map(filename => {
const globalFileVariables = extractions[filename].variables.global;

Object.keys(globalFileVariables).map(variableKey => {
let variable = extractedVariables.global[variableKey];
let variableSources = [];
let variableExpressions = [];

if(!variable) {
variable = extractedVariables.global[variableKey] = Object.assign({}, globalFileVariables[variableKey].value, {
sources: [],
expressions: [],
});
if(variable) {
variableSources = variable.sources;
variableExpressions = variable.expressions;
}

variable.sources.push(filename);
variable.expressions.push(globalFileVariables[variableKey].expression);
variable = extractedVariables.global[variableKey] = Object.assign({}, globalFileVariables[variableKey].value, {
sources: [...variableSources, filename],
expressions: [...variableExpressions, globalFileVariables[variableKey].expression],
});
});
});

Expand All @@ -76,14 +78,14 @@ export function extract(rendered, { compileOptions = {} } = {}) {
const { entryFilename, includedFiles, includedPaths } = getRenderedStats(rendered, compileOptions);

return loadCompiledFiles(includedFiles, entryFilename, compileOptions.data)
.then(compiledFiles => {
.then(({ compiledFiles, orderedFiles }) => {
const extractions = processFiles(compiledFiles);
const importer = makeImporter(extractions, includedFiles, includedPaths);
const extractionCompileOptions = makeExtractionCompileOptions(compileOptions, entryFilename, extractions, importer);

return sass.renderAsync(extractionCompileOptions)
.then(() => {
return compileExtractionResult(extractions)
return compileExtractionResult(orderedFiles, extractions)
});
});
}
Expand All @@ -95,12 +97,12 @@ export function extract(rendered, { compileOptions = {} } = {}) {
export function extractSync(rendered, { compileOptions = {} } = {}) {
const { entryFilename, includedFiles, includedPaths } = getRenderedStats(rendered, compileOptions);

const compiledFiles = loadCompiledFilesSync(includedFiles, entryFilename, compileOptions.data);
const { compiledFiles, orderedFiles } = loadCompiledFilesSync(includedFiles, entryFilename, compileOptions.data);
const extractions = processFiles(compiledFiles);
const importer = makeSyncImporter(extractions, includedFiles, includedPaths);
const extractionCompileOptions = makeExtractionCompileOptions(compileOptions, entryFilename, extractions, importer);

sass.renderSync(extractionCompileOptions);

return compileExtractionResult(extractions);
return compileExtractionResult(orderedFiles, extractions);
}
14 changes: 10 additions & 4 deletions src/load.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,18 @@ const RAW_DATA_FILE = 'data';
/**
* Include any raw compilation data as a 'data' file
*/
function includeRawDataFile(files, entryFilename, data) {
function includeRawDataFile(includedFiles, files, entryFilename, data) {
let orderedFiles = includedFiles;

if(entryFilename === RAW_DATA_FILE && data) {
files[RAW_DATA_FILE] = data;
orderedFiles = [RAW_DATA_FILE, ...orderedFiles];
}

return files;
return {
compiledFiles: files,
orderedFiles,
};
}

/**
Expand Down Expand Up @@ -43,7 +49,7 @@ export function loadCompiledFiles(includedFiles, entryFilename, data) {
});
}))
.then(() => {
return includeRawDataFile(files, entryFilename, data);
return includeRawDataFile(includedFiles, files, entryFilename, data);
});
}

Expand All @@ -57,5 +63,5 @@ export function loadCompiledFilesSync(includedFiles, entryFilename, data) {
files[filename] = loadSync(filename);
});

return includeRawDataFile(files, entryFilename, data);
return includeRawDataFile(includedFiles, files, entryFilename, data);
}
29 changes: 29 additions & 0 deletions test/order.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
const { expect } = require('chai');
const path = require('path');
const { render, renderSync } = require('../lib');
const { normalizePath } = require('../lib/util');

const orderFile = path.join(__dirname, 'sass', 'order.scss');
const order1File = path.join(__dirname, 'sass', 'order', '1.scss');
const order2File = path.join(__dirname, 'sass', 'order', '2.scss');

function verifyOrder(rendered, sourceFile, partialFile) {
expect(rendered.vars).to.exist;
expect(rendered.vars).to.have.property('global');
expect(rendered.vars.global).to.have.property('$var');

expect(rendered.vars.global.$var.value).to.equal(2);
expect(rendered.vars.global.$var.sources[0]).to.equal(normalizePath(order1File));
expect(rendered.vars.global.$var.sources[1]).to.equal(normalizePath(order2File));
}

describe('partial', () => {
describe('sync', () => {
it('should extract in the right order', () => {
for(let i = 0; i < 20; i++) {
const rendered = renderSync({ file: orderFile })
verifyOrder(rendered);
}
});
});
});
2 changes: 2 additions & 0 deletions test/sass/order.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@import './order/2.scss';
@import './order/1.scss';
1 change: 1 addition & 0 deletions test/sass/order/1.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
$var: 1;
1 change: 1 addition & 0 deletions test/sass/order/2.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
$var: 2;

0 comments on commit bb0c34c

Please sign in to comment.