Skip to content

Commit

Permalink
Merge pull request #48 from enb-bem/support-decl-formats
Browse files Browse the repository at this point in the history
Support decl formats
  • Loading branch information
Andrew Abramov committed Sep 11, 2014
2 parents efa7dde + 0d2c1be commit 85efeed
Show file tree
Hide file tree
Showing 22 changed files with 265 additions and 267 deletions.
3 changes: 0 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,10 @@

* Удалена вся логика, связанная с `BEViS` методологией.
* Технологии `bemdecl-from-bemjson`, `bemdecl-from-deps-by-tech` и `bemdecl-merge` теперь предоставляют результат в `bemdecl` формате, вместо `deps` формата.
* Технологии `deps` и `deps-old` теперь ожидают от `bemdecl`-таргетов результаты в `bemdecl` формате.

### Крупные изменения

* Опция `levels` из `levels` технологии теперь может принимать пути относительно корня, вместо абсолютных.
* Добавлены опции `sourceDepsFormat` для `deps` и `deps-old` технологий.
* Добавлена опция `depsFormat` для `files` технологии.
* Технология `bemdecl-merge` переименована в `merge-bemdecl`.
* Технология `deps-merge` переименована в `merge-deps`.
* Технология `deps-subtract` переименована в `subtract-deps`.
Expand Down
3 changes: 0 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,6 @@ nodeConfig.addTech([require('enb-bem/techs/merge-bemdecl'), {
**Опции**

* *String* **sourceDepsFile** — Файл с исходными зависимостями. По умолчанию — `?.bemdecl.js`.
* *String* **sourceDepsFormat** — Формат исходных зависимостей. По умолчанию — `bemdecl.js`.
* *String* **levelsTarget** — Исходный levels. По умолчанию — `?.levels`.
* *String* **target** — Результирующий deps. По умолчанию — `?.deps.js`.

Expand Down Expand Up @@ -171,7 +170,6 @@ nodeConfig.addTech([require('enb-bem/techs/deps'), {
**Опции**

* *String* **sourceDepsFile** — Файл с исходными зависимостями. По умолчанию — `?.bemdecl.js`.
* *String* **sourceDepsFormat** — Формат исходных зависимостей. По умолчанию — `bemdecl.js`.
* *String* **levelsTarget** — Исходный levels. По умолчанию — `?.levels`.
* *String* **target** — Результирующий deps. По умолчанию — `?.deps.js`.

Expand Down Expand Up @@ -275,7 +273,6 @@ nodeConfig.addTechs([
**Опции**

* *String* **depsFile** — Исходный deps-таргет. По умолчанию — `?.deps.js`.
* *String* **depsFormat** — Формат зависимостей. По умолчанию — `deps.js`.
* *String* **levelsTarget** — Исходный levels. По умолчанию — `?.levels`.
* *String* **filesTarget** — Результирующий files-таргет. По умолчанию — `?.files`.
* *String* **dirsTarget** — Результирующий dirs-таргет. По умолчанию — `?.dirs`.
Expand Down
4 changes: 2 additions & 2 deletions techs/bemdecl-from-bemjson.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ module.exports = inherit(require('enb/lib/tech/base-tech'), {
.then(function () {
cache.cacheFileInfo('bemdecl-file', bemdeclFilename);
cache.cacheFileInfo('bemjson-file', bemjsonFilename);
node.resolveTarget(target, bemdecl);
node.resolveTarget(target, { blocks: bemdecl });
});
});
} else {
Expand All @@ -84,7 +84,7 @@ module.exports = inherit(require('enb/lib/tech/base-tech'), {

return asyncRequire(bemdeclFilename)
.then(function (result) {
node.resolveTarget(target, result.blocks);
node.resolveTarget(target, result);
return null;
});
}
Expand Down
136 changes: 88 additions & 48 deletions techs/bemdecl-from-deps-by-tech.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,62 +22,102 @@
* });
* ```
*/
var vm = require('vm'),
var inherit = require('inherit'),
vm = require('vm'),
vow = require('vow'),
vfs = require('enb/lib/fs/async-fs'),
asyncRequire = require('enb/lib/fs/async-require'),
dropRequireCache = require('enb/lib/fs/drop-require-cache'),
deps = require('../lib/deps/deps');

/**
* @type {Tech}
*/
module.exports = require('enb/lib/build-flow').create()
.name('bemdecl-from-deps-by-tech')
.target('target', '?.bemdecl.js')
.defineRequiredOption('sourceTech')
.defineRequiredOption('destTech')
.useFileList('deps.js')
.wrapper(function (bemdecl) {
return 'exports.blocks = ' + JSON.stringify(bemdecl, null, 4) + ';\n';
})
.builder(function (depsFiles) {
var sourceTech = this._sourceTech,
module.exports = inherit(require('enb/lib/tech/base-tech'), {
getName: function () {
return 'bemdecl-from-deps-by-tech';
},

configure: function () {
this._target = this.node.unmaskTargetName(this.getOption('target', '?.bemdecl.js'));
this._filesTarget = this.node.unmaskTargetName(this.getOption('filesTarget', '?.files'));
this._sourceTech = this.getRequiredOption('sourceTech');
this._destTech = this.getRequiredOption('destTech');
},

getTargets: function () {
return [this._target];
},

build: function () {
var node = this.node,
target = this._target,
cache = node.getNodeCache(target),
bemdeclFilename = node.resolvePath(target),
filesFilename = node.resolvePath(this._filesTarget),
sourceTech = this._sourceTech,
destTech = this._destTech;
return vow.all(depsFiles.map(function (file) {
return vfs.read(file.fullname, 'utf8').then(function (text) {
return { file: file, text: text };
});
})).then(function (depResults) {
var result = [],
depIndex = {};
depResults.forEach(function (depResult) {
var fileDeps = vm.runInThisContext(depResult.text);
if (!fileDeps) {
return;
}
fileDeps = Array.isArray(fileDeps) ? fileDeps : [fileDeps];
fileDeps.forEach(function (dep) {
if (dep.tech === sourceTech) {
['mustDeps', 'shouldDeps'].forEach(function (depType) {
if (dep[depType]) {
deps.flattenDeps(dep[depType]).forEach(function (singleDep) {
if (singleDep.tech === destTech) {
var key = depKey(singleDep);
if (!depIndex[key]) {
depIndex[key] = true;
result.push(singleDep);
}
}
});

return this.node.requireSources([this._filesTarget])
.spread(function (files) {
if (cache.needRebuildFile('bemdecl-file', bemdeclFilename) ||
cache.needRebuildFile('files-file', filesFilename)
) {
var depsFiles = files.bySuffix['deps.js'];

return vow.all(depsFiles.map(function (file) {
return vfs.read(file.fullname, 'utf8').then(function (text) {
return { file: file, text: text };
});
})).then(function (depResults) {
var result = [],
depIndex = {};

depResults.forEach(function (depResult) {
var fileDeps = vm.runInThisContext(depResult.text);
if (!fileDeps) {
return;
}
fileDeps = Array.isArray(fileDeps) ? fileDeps : [fileDeps];
fileDeps.forEach(function (dep) {
if (dep.tech === sourceTech) {
['mustDeps', 'shouldDeps'].forEach(function (depType) {
if (dep[depType]) {
deps.flattenDeps(dep[depType]).forEach(function (singleDep) {
if (singleDep.tech === destTech) {
var key = depKey(singleDep);
if (!depIndex[key]) {
depIndex[key] = true;
result.push(singleDep);
}
}
});
}
});
}
});
});
}
});
});

return deps.toBemdecl(result);
});
})
.createTech();
var blocks = deps.toBemdecl(result),
str = 'exports.blocks = ' + JSON.stringify(blocks, null, 4) + ';\n';

return vfs.write(bemdeclFilename, str, 'utf-8')
.then(function () {
cache.cacheFileInfo('bemdecl-file', bemdeclFilename);
cache.cacheFileInfo('files-file', filesFilename);
node.resolveTarget(target, { blocks: blocks });
});
});
} else {
node.isValidTarget(target);
dropRequireCache(require, bemdeclFilename);

return asyncRequire(bemdeclFilename)
.then(function (result) {
node.resolveTarget(target, result);
return null;
});
}
});
}
});

function depKey(dep) {
return dep.block +
Expand Down
28 changes: 8 additions & 20 deletions techs/deps-old.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
* **Опции**
*
* * *String* **sourceDepsFile** — Файл с исходными зависимостями. По умолчанию — `?.bemdecl.js`.
* * *String* **sourceDepsFormat** — Формат исходных зависимостей. По умолчанию — `bemdecl.js`.
* * *String* **levelsTarget** — Исходный levels. По умолчанию — `?.levels`.
* * *String* **target** — Результирующий deps. По умолчанию — `?.deps.js`.
*
Expand Down Expand Up @@ -60,7 +59,6 @@ module.exports = inherit(require('enb/lib/tech/base-tech'), {
this._sourceDepsFile = this.getOption('sourceDepsFile', this.node.getTargetName('bemdecl.js'));
}
this._sourceDepsFile = this.node.unmaskTargetName(this._sourceDepsFile);
this._sourceDepsFormat = this.getOption('sourceDepsFormat', 'bemdecl.js');

this._levelsTarget = this.node.unmaskTargetName(
this.getOption('levelsTarget', this.node.getTargetName('levels')));
Expand All @@ -75,7 +73,6 @@ module.exports = inherit(require('enb/lib/tech/base-tech'), {
target = this._target,
targetFilename = node.resolvePath(target),
cache = node.getNodeCache(target),
sourceDepsFormat = this._sourceDepsFormat,
sourceDepsFilename = this.node.resolvePath(this._sourceDepsFile);

return this.node.requireSources([this._levelsTarget, this._sourceDepsFile])
Expand All @@ -86,7 +83,7 @@ module.exports = inherit(require('enb/lib/tech/base-tech'), {
cache.needRebuildFile('source-deps-file', sourceDepsFilename) ||
cache.needRebuildFileList('deps-file-list', depFiles)
) {
return requireSourceDeps(sourceDeps, sourceDepsFilename, sourceDepsFormat)
return requireSourceDeps(sourceDeps, sourceDepsFilename)
.then(function (sourceDeps) {
return (new OldDeps(sourceDeps).expandByFS({ levels: levels }))
.then(function (resolvedDeps) {
Expand All @@ -98,7 +95,7 @@ module.exports = inherit(require('enb/lib/tech/base-tech'), {
cache.cacheFileInfo('deps-file', targetFilename);
cache.cacheFileInfo('source-deps-file', sourceDepsFilename);
cache.cacheFileList('deps-file-list', depFiles);
node.resolveTarget(target, resultDeps);
node.resolveTarget(target, { deps: resultDeps });
});
});
});
Expand All @@ -108,33 +105,24 @@ module.exports = inherit(require('enb/lib/tech/base-tech'), {

return asyncRequire(targetFilename)
.then(function (result) {
node.resolveTarget(target, result.deps);
node.resolveTarget(target, result);
return null;
});
}
});
}
});

function requireSourceDeps(data, filename, format) {
function requireSourceDeps(data, filename) {
return (data ? vow.resolve(data) : (
dropRequireCache(require, filename),
dropRequireCache(require, filename),
asyncRequire(filename)
.then(function (result) {
if ('bemdecl.js' === format) {
return result.blocks;
}

if ('deps.js' === format) {
return result.deps;
}
})
))
.then(function (sourceDeps) {
if (format === 'deps.js') {
sourceDeps = deps.toBemdecl(sourceDeps);
if (sourceDeps.blocks) {
return deps.fromBemdecl(sourceDeps.blocks);
}

return sourceDeps;
return sourceDeps.deps;
});
}
30 changes: 9 additions & 21 deletions techs/deps.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
* **Опции**
*
* * *String* **sourceDepsFile** — Файл с исходными зависимостями. По умолчанию — `?.bemdecl.js`.
* * *String* **sourceDepsFormat** — Формат исходных зависимостей. По умолчанию — `bemdecl.js`.
* * *String* **levelsTarget** — Исходный levels. По умолчанию — `?.levels`.
* * *String* **target** — Результирующий deps. По умолчанию — `?.deps.js`.
*
Expand Down Expand Up @@ -59,7 +58,6 @@ module.exports = inherit(require('enb/lib/tech/base-tech'), {
this._sourceDepsFile = this.getOption('sourceDepsFile', this.node.getTargetName('bemdecl.js'));
}
this._sourceDepsFile = this.node.unmaskTargetName(this._sourceDepsFile);
this._sourceDepsFormat = this.getOption('sourceDepsFormat', 'bemdecl.js');

this._levelsTarget = this.node.unmaskTargetName(
this.getOption('levelsTarget', this.node.getTargetName('levels')));
Expand All @@ -74,7 +72,6 @@ module.exports = inherit(require('enb/lib/tech/base-tech'), {
target = this._target,
targetFilename = node.resolvePath(target),
cache = node.getNodeCache(target),
sourceDepsFormat = this._sourceDepsFormat,
sourceDepsFilename = this.node.resolvePath(this._sourceDepsFile);

return this.node.requireSources([this._levelsTarget, this._sourceDepsFile])
Expand All @@ -85,7 +82,7 @@ module.exports = inherit(require('enb/lib/tech/base-tech'), {
cache.needRebuildFile('source-deps-file', sourceDepsFilename) ||
cache.needRebuildFileList('deps-file-list', depFiles)
) {
return requireSourceDeps(sourceDeps, sourceDepsFilename, sourceDepsFormat)
return requireSourceDeps(sourceDeps, sourceDepsFilename)
.then(function (sourceDeps) {
var resolver = new DepsResolver(levels),
decls = resolver.normalizeDeps(sourceDeps);
Expand All @@ -100,7 +97,7 @@ module.exports = inherit(require('enb/lib/tech/base-tech'), {
cache.cacheFileInfo('deps-file', targetFilename);
cache.cacheFileInfo('source-deps-file', sourceDepsFilename);
cache.cacheFileList('deps-file-list', depFiles);
node.resolveTarget(target, resolvedDeps);
node.resolveTarget(target, { deps: resolvedDeps });
});
});
});
Expand All @@ -110,33 +107,24 @@ module.exports = inherit(require('enb/lib/tech/base-tech'), {

return asyncRequire(targetFilename)
.then(function (result) {
node.resolveTarget(target, result.deps);
node.resolveTarget(target, result);
return null;
});
}
});
}
});

function requireSourceDeps(data, filename, format) {
function requireSourceDeps(data, filename) {
return (data ? vow.resolve(data) : (
dropRequireCache(require, filename),
asyncRequire(filename)
.then(function (result) {
if (format === 'bemdecl.js') {
return result.blocks;
}

if (format === 'deps.js') {
return result.deps;
}
})
dropRequireCache(require, filename),
asyncRequire(filename)
))
.then(function (sourceDeps) {
if (format === 'bemdecl.js') {
sourceDeps = deps.fromBemdecl(sourceDeps);
if (sourceDeps.blocks) {
return deps.fromBemdecl(sourceDeps.blocks);
}

return sourceDeps;
return sourceDeps.deps;
});
}

0 comments on commit 85efeed

Please sign in to comment.