Skip to content

Commit

Permalink
Merge 2ad53c5 into 49a9710
Browse files Browse the repository at this point in the history
  • Loading branch information
dima117 committed Oct 1, 2017
2 parents 49a9710 + 2ad53c5 commit 3dfc2de
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 91 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@

node_modules
coverage
.idea
11 changes: 7 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,18 @@
"enb": ">=0.15.0 <2.0.0"
},
"dependencies": {
"@bem/sdk.decl": "0.1.0",
"@bem/sdk.deps": "0.1.0",
"@bem/sdk.naming.entity.stringify": "0.1.0",
"@bem/sdk.naming.presets": "0.1.0-alpha.21b40d0b",
"@bem/sdk.bemjson-to-decl": "^0.2.0",
"@bem/sdk.cell": "^0.2.0",
"@bem/sdk.decl": "0.2.0",
"@bem/sdk.deps": "0.2.0",
"@bem/sdk.naming.entity.stringify": "0.2.0",
"@bem/sdk.naming.presets": "0.0.3",
"bem-naming": "1.0.1",
"bem-walk": "1.0.0-1",
"file-eval": "1.0.0",
"inherit": "2.2.6",
"lodash": "4.16.4",
"node-eval": "^1.1.1",
"vow": "0.4.12"
},
"devDependencies": {
Expand Down
88 changes: 13 additions & 75 deletions techs/bemjson-to-bemdecl.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ var inherit = require('inherit'),
vfs = enb.asyncFS || require('enb/lib/fs/async-fs'),
BaseTech = enb.BaseTech || require('enb/lib/tech/base-tech'),
fileEval = require('file-eval'),
deps = require('../lib/deps/deps');
BemCell = require('@bem/sdk.cell'),
bemjsonToDecl = require('@bem/sdk.bemjson-to-decl'),
bemDecl = require('@bem/sdk.decl');

/**
* @class BemjsonToBemdeclTech
Expand Down Expand Up @@ -64,17 +66,21 @@ module.exports = inherit(BaseTech, {
) {
return fileEval(bemjsonFilename)
.then(function (bemjson) {
var bemjsonDeps = getDepsFromBemjson(bemjson),
decl,
data,
str;
var decl, data, str;

var entities = bemjsonToDecl.convert(bemjson);

var cells = entities.map(function (entity) {
return new BemCell({ entity: entity });
});

// bemdeclFormat: 'deps', 'bemdecl'
if (bemdeclFormat === 'deps') {
decl = bemjsonDeps;
decl = bemDecl.format(cells, { format: 'enb' });
data = { deps: decl };
str = 'exports.deps = ' + JSON.stringify(decl, null, 4) + ';\n';
} else {
decl = deps.toBemdecl(bemjsonDeps),
decl = bemDecl.format(cells, { format: 'v1' });
data = { blocks: decl };
str = 'exports.blocks = ' + JSON.stringify(decl, null, 4) + ';\n';
}
Expand All @@ -98,71 +104,3 @@ module.exports = inherit(BaseTech, {
});
}
});

function getDepsFromBemjson(bemjson) {
var deps = [];

addDepsFromBemjson(bemjson, deps, {}, null);

return deps;
}

function addDepsFromBemjson(bemjson, deps, depsIndex, parentBlockName) {
if (!bemjson) { return; }
if (Array.isArray(bemjson)) {
bemjson.forEach(function (bemjsonItem) {
addDepsFromBemjson(bemjsonItem, deps, depsIndex, parentBlockName);
});
} else {
if (bemjson.block || bemjson.elem) {
if (bemjson.elem && !bemjson.block) {
bemjson.block = parentBlockName;
}
var dep = { block: bemjson.block };
if (bemjson.elem) {
dep.elem = bemjson.elem;
}
var itemKey = depKey(dep);
if (!depsIndex[itemKey]) {
deps.push(dep);
depsIndex[itemKey] = true;
}
if (bemjson.elemMods) {
bemjson.mods = bemjson.elemMods;
}
if (bemjson.mods) {
for (var j in bemjson.mods) {
if (bemjson.mods.hasOwnProperty(j)) {
var subDep = { block: bemjson.block };
if (bemjson.elem) {
subDep.elem = bemjson.elem;
}
subDep.mod = j;
subDep.val = bemjson.mods[j];
var subItemKey = depKey(subDep);
if (!depsIndex[subItemKey]) {
deps.push(subDep);
depsIndex[subItemKey] = true;
}
}
}
}
}
for (var i in bemjson) {
if (bemjson.hasOwnProperty(i)) {
if (i !== 'mods' && i !== 'js' && i !== 'attrs') {
var value = bemjson[i];
if (Array.isArray(value) || (typeof value === 'object' && value !== null)) {
addDepsFromBemjson(bemjson[i], deps, depsIndex, bemjson.block || parentBlockName);
}
}
}
}
}
}

function depKey(dep) {
return dep.block +
(dep.elem ? '__' + dep.elem : '') +
(dep.mod ? '_' + dep.mod + (dep.val ? '_' + dep.val : '') : '');
}
4 changes: 2 additions & 2 deletions techs/deps-by-tech-to-bemdecl.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
var inherit = require('inherit'),
vm = require('vm'),
naming = require('bem-naming'),
nodeEval = require('node-eval'),
vow = require('vow'),
enb = require('enb'),
vfs = enb.asyncFS || require('enb/lib/fs/async-fs'),
Expand Down Expand Up @@ -94,7 +94,7 @@ module.exports = inherit(BaseTech, {
depIndex = {};

depResults.forEach(function (depResult) {
var fileDeps = vm.runInThisContext(depResult.text),
var fileDeps = nodeEval(depResult.text),
bemname = depResult.file.name.split('.')[0],
notation = naming.parse(bemname);

Expand Down
14 changes: 4 additions & 10 deletions test/techs/bemjson-to-bemdecl.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ describe('techs: bemjson-to-bemdecl', function () {
it('must detect boolean mod of block', function () {
var bemjson = { block: 'block', mods: { mod: true } },
bemdecl = [
{ name: 'block' },
{ name: 'block', mods: [{ name: 'mod', vals: [{ name: true }] }] }
];

Expand All @@ -38,8 +37,7 @@ describe('techs: bemjson-to-bemdecl', function () {
it('must detect mod of block', function () {
var bemjson = { block: 'block', mods: { 'mod-name': 'mod-val' } },
bemdecl = [
{ name: 'block' },
{ name: 'block', mods: [{ name: 'mod-name', vals: [{ name: 'mod-val' }] }] }
{ name: 'block', mods: [{ name: 'mod-name', vals: [{ name: true }, { name: 'mod-val' }] }] }
];

return assert(bemjson, bemdecl);
Expand All @@ -55,19 +53,17 @@ describe('techs: bemjson-to-bemdecl', function () {
it('must detect boolean mod of elem', function () {
var bemjson = { block: 'block', elem: 'elem', elemMods: { mod: true } },
bemdecl = [
{ name: 'block', elems: [{ name: 'elem' }] },
{ name: 'block', elems: [{ name: 'elem', mods: [{ name: 'mod', vals: [{ name: true }] }] }] }
];

return assert(bemjson, bemdecl);
});

it('must detect boolean mod of elem', function () {
it('must detect string mod of elem', function () {
var bemjson = { block: 'block', elem: 'elem', elemMods: { 'mod-name': 'mod-val' } },
bemdecl = [
{ name: 'block', elems: [{ name: 'elem' }] },
{ name: 'block', elems: [{ name: 'elem', mods: [
{ name: 'mod-name', vals: [{ name: 'mod-val' }] }]
{ name: 'mod-name', vals: [{ name: true }, { name: 'mod-val' }] }]
}] }
];

Expand Down Expand Up @@ -140,7 +136,6 @@ describe('techs: bemjson-to-bemdecl', function () {
]
},
bemdecl = [
{ name: 'block' },
{ name: 'block', elems: [{ name: 'elem' }] }
];

Expand Down Expand Up @@ -177,8 +172,7 @@ describe('techs: bemjson-to-bemdecl', function () {
{ block: 'block', mods: { 'mod-name': 'mod-val' } }
],
bemdecl = [
{ name: 'block' },
{ name: 'block', mods: [{ name: 'mod-name', vals: [{ name: 'mod-val' }] }] }
{ name: 'block', mods: [{ name: 'mod-name', vals: [{ name: true }, { name: 'mod-val' }] }] }
];

return assert(bemjson, bemdecl);
Expand Down

0 comments on commit 3dfc2de

Please sign in to comment.