Skip to content

Commit

Permalink
Merge 3f0878d into 49a9710
Browse files Browse the repository at this point in the history
  • Loading branch information
blond committed Oct 1, 2017
2 parents 49a9710 + 3f0878d commit ee86c23
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 115 deletions.
10 changes: 6 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,12 @@
"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",
Expand Down
140 changes: 39 additions & 101 deletions techs/bemjson-to-bemdecl.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,35 +3,37 @@ 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
* @augments {BaseTech}
* @classdesc
*
* Builds BEMDECL file from BEMJSON file.
*
* @param {Object} [options] Options.
* @param {String} [options.target='?.bemdecl.js'] Path to a built BEMDECL file.
* @param {String} [options.source='?.bemjson.js'] Path to a BEMJSON file.
* @param {String} [options.bemdeclFormat='bemdecl'] Format of result declaration (bemdecl or deps).
*
* @example
* var FileProvideTech = require('enb/techs/file-provider'),
* bemTechs = require('enb-bem-techs');
*
* module.exports = function(config) {
* config.node('bundle', function(node) {
* // get BEMJSON file
* node.addTech([FileProvideTech, { target: '?.bemjson.js' }]);
*
* // build BEMDECL file
* node.addTech(bemTechs.bemjsonToBemdecl);
* node.addTarget('?.bemdecl.js');
* });
* };
*/
* @class BemjsonToBemdeclTech
* @augments {BaseTech}
* @classdesc
*
* Builds BEMDECL file from BEMJSON file.
*
* @param {Object} [options] Options.
* @param {String} [options.target='?.bemdecl.js'] Path to a built BEMDECL file.
* @param {String} [options.source='?.bemjson.js'] Path to a BEMJSON file.
* @param {String} [options.bemdeclFormat='bemdecl'] Format of result declaration (bemdecl or deps).
*
* @example
* var FileProvideTech = require('enb/techs/file-provider'),
* bemTechs = require('enb-bem-techs');
*
* module.exports = function(config) {
* config.node('bundle', function(node) {
* // get BEMJSON file
* node.addTech([FileProvideTech, { target: '?.bemjson.js' }]);
*
* // build BEMDECL file
* node.addTech(bemTechs.bemjsonToBemdecl);
* node.addTarget('?.bemdecl.js');
* });
* };
*/
module.exports = inherit(BaseTech, {
getName: function () {
return 'bemjson-to-bemdecl';
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 : '') : '');
}
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 ee86c23

Please sign in to comment.