enb
Version:
Faster BEM/BEViS assembler
123 lines (112 loc) • 5.53 kB
JavaScript
/**
* deps
* ====
*
* Технология переехала в пакет `enb-bem-techs`.
*/
var vowFs = require('../lib/fs/async-fs');
var DepsResolver = require('../lib/deps/deps-resolver');
var inherit = require('inherit');
var asyncRequire = require('../lib/fs/async-require');
var dropRequireCache = require('../lib/fs/drop-require-cache');
module.exports = inherit(require('../lib/tech/base-tech'), {
getName: function () {
return 'deps';
},
configure: function () {
this._target = this.node.unmaskTargetName(
this.getOption('depsTarget', this.node.getTargetName('deps.js')));
this._bemdeclTarget = this.node.unmaskTargetName(
this.getOption('bemdeclTarget', this.node.getTargetName('bemdecl.js')));
this._levelsTarget = this.node.unmaskTargetName(
this.getOption('levelsTarget', this.node.getTargetName('levels')));
},
getTargets: function () {
return [this._target];
},
build: function () {
var _this = this;
var depsTarget = this._target;
var depsTargetPath = this.node.resolvePath(depsTarget);
var cache = this.node.getNodeCache(depsTarget);
var bemdeclSource = this._bemdeclTarget;
var bemdeclSourcePath = this.node.resolvePath(bemdeclSource);
var logger = this.node.getLogger();
logger.logTechIsDeprecated(this._target, this.getName(),
'enb', 'deps', 'enb-bem-techs');
return this.node.requireSources([this._levelsTarget, bemdeclSource]).spread(function (levels) {
var depFiles = levels.getFilesBySuffix('deps.js').concat(levels.getFilesBySuffix('deps.yaml'));
if (cache.needRebuildFile('deps-file', depsTargetPath) ||
cache.needRebuildFile('bemdecl-file', bemdeclSourcePath) ||
cache.needRebuildFileList('deps-file-list', depFiles)
) {
dropRequireCache(require, bemdeclSourcePath);
return asyncRequire(bemdeclSourcePath).then(function (bemdecl) {
var decls = [];
var dep = new DepsResolver(levels);
if (bemdecl.blocks) {
bemdecl.blocks.forEach(function (block) {
decls.push({
name: block.name
});
if (block.mods) {
block.mods.forEach(function (mod) {
if (mod.vals) {
mod.vals.forEach(function (val) {
decls.push({
name: block.name,
modName: mod.name,
modVal: val.name
});
});
}
});
}
if (block.elems) {
block.elems.forEach(function (elem) {
decls.push({
name: block.name,
elem: elem.name
});
if (elem.mods) {
elem.mods.forEach(function (mod) {
if (mod.vals) {
mod.vals.forEach(function (val) {
decls.push({
name: block.name,
elem: elem.name,
modName: mod.name,
modVal: val.name
});
});
}
});
}
});
}
});
}
if (bemdecl.deps) {
decls = decls.concat(dep.normalizeDeps(bemdecl.deps));
}
return dep.addDecls(decls).then(function () {
var resolvedDeps = dep.resolve();
return vowFs.write(
depsTargetPath, 'exports.deps = ' + JSON.stringify(resolvedDeps, null, 4) + ';\n', 'utf8'
).then(function () {
cache.cacheFileInfo('deps-file', depsTargetPath);
cache.cacheFileInfo('bemdecl-file', bemdeclSourcePath);
cache.cacheFileList('deps-file-list', depFiles);
_this.node.resolveTarget(depsTarget, resolvedDeps);
});
});
});
} else {
_this.node.isValidTarget(depsTarget);
dropRequireCache(require, depsTargetPath);
_this.node.resolveTarget(depsTarget, require(depsTargetPath).deps);
return null;
}
});
}
});