Skip to content

Commit

Permalink
Merge e8f96c0 into a877bed
Browse files Browse the repository at this point in the history
  • Loading branch information
skad0 committed Sep 23, 2016
2 parents a877bed + e8f96c0 commit 827de4e
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 33 deletions.
96 changes: 63 additions & 33 deletions lib/deps/deps.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
var decl = require('bem-decl');
/**
* A set of utilities for work with dependencies.
*
Expand All @@ -12,24 +13,10 @@ module.exports = {
* @returns {Array}
*/
merge: function (depsToMerge) {
depsToMerge = [].concat(depsToMerge);
var startingDep = depsToMerge.shift(),
index = buildDepsIndex(startingDep),
result = [].concat(startingDep),
currentDep,
dep,
key;
while (!!(currentDep = depsToMerge.shift())) {
for (var i = 0, l = currentDep.length; i < l; i++) {
dep = currentDep[i];
key = depKey(dep);
if (!index[key]) {
result.push(dep);
index[key] = true;
}
}
}
return result;
var deps = [].concat(depsToMerge).map(function (item) {
return this._convertFromMod(item);
}.bind(this));
return this._convertToMod(decl.merge.apply(this, deps));
},

/**
Expand All @@ -41,10 +28,20 @@ module.exports = {
* @returns {Array}
*/
subtract: function (from, what) {
var whatIndex = buildDepsIndex(what);
return from.filter(function (dep) {
return !whatIndex[depKey(dep)];
});
return this._convertToMod(decl.subtract(this._convertFromMod(from) ,this._convertFromMod(what)));
},

/**
* Intersects DEPS declarations
*
* @param {Array} depsToIntersect
* @return {Array}
*/
intersect: function (depsToIntersect) {
var deps = [].concat(depsToIntersect).map(function (item) {
return this._convertFromMod(item);
}.bind(this));
return this._convertToMod(decl.intersect.apply(this, deps));
},

/**
Expand Down Expand Up @@ -237,19 +234,52 @@ module.exports = {
} else {
return this.flattenDep(deps);
}
},

/**
* Coverts declaration mod and val to modName and modVal
*
* @param {Array|Object} deps
* @return {Array}
*/
_convertFromMod: function (deps) {
return _switchModsFormat('mod', {
mod: 'modName',
val: 'modVal'
}, deps);
},

/**
* Coverts declaration modName and modVal to mod and val
*
* @param {Array|Object} deps
* @return {Array}
*/
_convertToMod: function (deps) {
return _switchModsFormat('modName', {
modName: 'mod',
modVal: 'val'
}, deps);
}
};

function depKey(dep) {
return dep.block +
(dep.elem ? '__' + dep.elem : '') +
(dep.mod ? '_' + dep.mod + (dep.val ? '_' + dep.val : '') : '');
}
/**
* Switch declaration mod format
*
* @param {String} conditionKey mod or modName
* @param {Object} modsMap map of replacements (for example mod: 'modName')
* @param {Array|Object} deps
* @return {Array}
*/
function _switchModsFormat (conditionKey, modsMap, deps) {
Array.isArray(deps) || (deps = [deps]);

function buildDepsIndex(deps) {
var result = {};
for (var i = 0, l = deps.length; i < l; i++) {
result[depKey(deps[i])] = true;
}
return result;
return deps.map(function (item) {
if (!item[conditionKey]) return item;

return Object.keys(item).reduce(function (acc, key) {
acc[modsMap[key] || key] = item[key];
return acc;
}, {});
});
}
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
"enb": ">=0.15.0 <2.0.0"
},
"dependencies": {
"bem-decl": "^0.2.3",
"bem-naming": "1.0.1",
"bem-walk": "1.0.0-1",
"clear-require": "1.0.1",
Expand Down
43 changes: 43 additions & 0 deletions test/unit/deps.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,25 @@ describe('libs: deps', function () {
deps.subtract(firstDecl, secondDecl).must.be.eql(output);
});

it('must intersect deps', function () {
var firstDecl = [
{ block: 'block1' },
{ block: 'block1', mod: 'mod1', val: 'val1' },
{ block: 'block1', mod: 'mod2', val: 'val2' }
],
secondDecl = [
{ block: 'block1' },
{ block: 'block1', mod: 'mod2', val: 'val2' },
{ block: 'block2', mod: 'mod1', val: 'val1' }
],
output = [
{ block: 'block1' },
{ block: 'block1', mod: 'mod2', val: 'val2' }
];

deps.intersect([firstDecl, secondDecl]).must.be.eql(output);
});

it('must transform bemdecl to deps', function () {
var input = [{
name: 'block1',
Expand Down Expand Up @@ -156,4 +175,28 @@ describe('libs: deps', function () {

deps.flattenDeps(input).must.be.eql(output);
});

it('must convert mod and val to modName and modVal', function () {
deps._convertFromMod([
{ block: 'block', elem: 'elem', mod: 'mod1', val: 'val1' },
{ block: 'block' },
{ block: 'block', mod: 'mod2', val: 'val2' }
]).must.be.eql([
{ block: 'block', elem: 'elem', modName: 'mod1', modVal: 'val1' },
{ block: 'block' },
{ block: 'block', modName: 'mod2', modVal: 'val2' }
]);
});

it('must convert modName and modVal to mod and val', function () {
deps._convertToMod([
{ block: 'block', elem: 'elem', modName: 'mod1', modVal: 'val1' },
{ block: 'block' },
{ block: 'block', modName: 'mod2', modVal: 'val2' }
]).must.be.eql([
{ block: 'block', elem: 'elem', mod: 'mod1', val: 'val1' },
{ block: 'block' },
{ block: 'block', mod: 'mod2', val: 'val2' }
]);
});
});

0 comments on commit 827de4e

Please sign in to comment.