bem-techs-core
Version:
Core bem tech modules
116 lines (88 loc) • 3.8 kB
JavaScript
;
var BEM = require('bem'),
Q = BEM.require('q'),
Deps = require('bem/lib/techs/v2/deps.js').Deps;
exports.API_VER = 2;
exports.techMixin = {
getWeakBuildSuffixesMap:function(){
return { 'js' : ['browser.js', 'vanilla.js', 'js', 'bemhtml', 'bemhtml.xjst'] };
},
getBuildSuffixesMap:function(){
return { 'js' : ['browser.js', 'js'] };
},
transformBuildDecl:function(decl_){
var _this = this;
return decl_.then(function(decl){
var browserTech = _this.context.createTech('browser.js');
var browserDeps_ = browserTech.transformBuildDecl(decl_, { 'bemhtml' : 1 });
return browserDeps_.then(function(browserDeps){
var bemhtmlItems = [];
var uniq = {};
var depsGraph = new Deps().parseDepsDecl(decl);
var keys = browserDeps.adjacentRoots.bemhtml.map(function(item){return item.buildKey()})
depsGraph._walk(keys, depsGraph.items[''], _predicate, _action);
function _predicate(item, ctx) {
var key = item.buildKey();
if(!uniq[key]){
uniq[key] = 1;
if(item.item.tech === 'bemhtml'){
return true;
} else if(!item.item.tech){
return true;
} else {
return false;
}
}
}
function _action(item) {
var key = item.buildKey();
if(uniq[key] === 1){
uniq[key] = 2;
if(!item.item.tech){
item = item.clone();
delete item.key;
item.item.tech = 'bemhtml';
key = item.buildKey();
if(!uniq[key] || uniq[key] === 1){
uniq[key] = 2;
bemhtmlItems.push(item.item);
}
} else {
bemhtmlItems.push(item.item)
}
}
}
var res = {
deps: browserDeps.deps.concat(bemhtmlItems),
browserDeps: browserDeps.deps,
bemhtmlDeps: bemhtmlItems
};
_this._decl = res;
return res;
});
});
},
getBuildResult: function(files, destSuffix, output, opts) {
var _this = this;
var decl = _this._decl;
var browserDeps = decl.browserDeps;
var bemhtmlDeps = decl.bemhtmlDeps;
var levels = this.context.getLevels();
var bemhtmlTech = _this.context.createTech('bemhtml'),
browserTech = _this.context.createTech('browser.js');
if(!(browserTech.API_VER === 2 && bemhtmlTech.API_VER === 2)){
return Q.reject(_this.getTechName() + ' can\'t use v1 techs to produce pieces of result');
}
var broDecl = {deps: decl.browserDeps};
var bhDecl = {deps: decl.bemhtmlDeps};
opts = Object.create(opts);
opts.force = true;
return Q.all([
bemhtmlTech.getBuildResults(Q.when(bhDecl), levels, output, opts),
browserTech.getBuildResults(Q.when(broDecl), levels, output, opts)
]).spread(function(bemhtml,browser){
browser.js.push(bemhtml['bemhtml.js']+'\n')
return browser.js;
})
}
};