Skip to content

Commit

Permalink
Merge 15e65e2 into 85efeed
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrew Abramov committed Sep 11, 2014
2 parents 85efeed + 15e65e2 commit a621a15
Show file tree
Hide file tree
Showing 5 changed files with 185 additions and 165 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,12 @@
### Изменения, ломающие обратную совместимость

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

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

* Опция `levels` из `levels` технологии теперь может принимать пути относительно корня, вместо абсолютных.
* Технология `bemdecl-from-bemjson` переименована в `bemjson-to-bemdecl`.
* Технология `bemdecl-merge` переименована в `merge-bemdecl`.
* Технология `deps-merge` переименована в `merge-deps`.
* Технология `deps-subtract` переименована в `subtract-deps`.
Expand Down
31 changes: 15 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ $ npm install --save-dev enb-bem

* [`levels`](#levels)
* [`provide-bemdecl`](#provide-bemdecl)
* [`bemdecl-from-bemjson`](#bemdecl-from-bemjson)
* [`bemdecl-from-deps-by-tech`](#bemdecl-from-deps-by-tech)
* [`bemjson-to-bemdecl`](#bemjson-to-bemdecl)
* [`merge-bemdecl`](#merge-bemdecl)
* [`deps`](#deps)
* [`deps-old`](#deps-old)
Expand Down Expand Up @@ -76,44 +76,43 @@ nodeConfig.addTech([require('enb-bem/techs/provide-bemdecl'), {

-------------------------------------------------------------------------------

### bemdecl-from-bemjson
### bemdecl-from-deps-by-tech

Формирует `bemdecl` на основе `?.bemjson.js`.
Формирует `bemdecl` на основе depsByTech-информации из `?.deps.js`.

**Опции**

* *String* **source** — Исходный bemjson-таргет. По умолчанию — `?.bemjson.js`.
* *String* **sourceTech** — Имя исходной технологии. Обязательная опция.
* *String* **destTech** — Имя конечной технологии. Обязательная опция.
* *String* **filesTarget** — files-таргет, на основе которого получается список исходных файлов (его предоставляет технология `files`). По умолчанию — `?.files`.
* *String* **sourceSuffixes** — суффиксы файлов, по которым строится `files`-таргет. По умолчанию — `'deps.js'`.
* *String* **target** — Результирующий bemdecl-таргет. По умолчанию — `?.bemdecl.js`.

**Пример**

```javascript
nodeConfig.addTech(require('enb-bem/techs/bemdecl-from-bemjson'));
nodeConfig.addTech(require('enb-bem/techs/bemdecl-from-deps-by-tech'), {
sourceTech: 'js',
destTech: 'bemhtml'
});
```

-------------------------------------------------------------------------------

### bemdecl-from-deps-by-tech
### bemjson-to-bemdecl

Формирует `bemdecl` на основе depsByTech-информации из `?.deps.js`.
Формирует `bemdecl` на основе `?.bemjson.js`.

**Опции**

* *String* **sourceTech** — Имя исходной технологии. Обязательная опция.
* *String* **destTech** — Имя конечной технологии. Обязательная опция.
* *String* **filesTarget** — files-таргет, на основе которого получается список исходных файлов (его предоставляет технология `files`). По умолчанию — `?.files`.
* *String* **sourceSuffixes** — суффиксы файлов, по которым строится `files`-таргет. По умолчанию — `'deps.js'`.
* *String* **source** — Исходный bemjson-таргет. По умолчанию — `?.bemjson.js`.
* *String* **target** — Результирующий bemdecl-таргет. По умолчанию — `?.bemdecl.js`.

**Пример**

```javascript
nodeConfig.addTech(require('enb-bem/techs/bemdecl-from-deps-by-tech'), {
sourceTech: 'js',
destTech: 'bemhtml'
});
nodeConfig.addTech(require('enb-bem/techs/bemdecl-from-bemjson'));
```

-------------------------------------------------------------------------------

### merge-bemdecl
Expand Down
153 changes: 6 additions & 147 deletions techs/bemdecl-from-bemjson.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,160 +2,19 @@
* bemdecl-from-bemjson
* ====================
*
* Формирует *bemdecl* на основе `?.bemjson.js`.
*
* **Опции**
*
* * *String* **source** — Исходный bemjson-таргет. По умолчанию — `?.bemjson.js`.
* * *String* **target** — Результирующий bemdecl-таргет. По умолчанию — `?.bemdecl.js`.
*
* **Пример**
*
* ```javascript
* nodeConfig.addTech(require('enb-bem/techs/bemdecl-from-bemjson'));
* ```
*
* Технология переименована в `bemjson-to-bemdecl`
*/
var inherit = require('inherit'),
vfs = require('enb/lib/fs/async-fs'),
requireOrEval = require('enb/lib/fs/require-or-eval'),
asyncRequire = require('enb/lib/fs/async-require'),
dropRequireCache = require('enb/lib/fs/drop-require-cache'),
deps = require('../lib/deps/deps');
var inherit = require('inherit');

module.exports = inherit(require('enb/lib/tech/base-tech'), {
module.exports = inherit(require('./bemjson-to-bemdecl'), {
getName: function () {
return 'bemdecl-from-bemjson';
},

configure: function () {
var logger = this.node.getLogger();

this._target = this.getOption('destTarget');
if (this._target) {
logger.logOptionIsDeprecated(this.node.unmaskTargetName(this._target), 'enb-bem', this.getName(),
'destTarget', 'target');
} else {
this._target = this.getOption('target', '?.bemdecl.js');
}
this._target = this.node.unmaskTargetName(this._target);

this._sourceTarget = this.getOption('sourceTarget');
if (this._sourceTarget) {
logger.logOptionIsDeprecated(this._target, 'enb-bem', this.getName(), 'sourceTarget', 'source');
} else {
this._sourceTarget = this.getOption('source', '?.bemjson.js');
}
this._sourceTarget = this.node.unmaskTargetName(this._sourceTarget);
},

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

build: function () {
var node = this.node,
target = this._target,
cache = node.getNodeCache(target),
bemdeclFilename = node.resolvePath(target),
bemjsonFilename = node.resolvePath(this._sourceTarget);

return this.node.requireSources([this._sourceTarget])
.then(function () {
if (cache.needRebuildFile('bemdecl-file', bemdeclFilename) ||
cache.needRebuildFile('bemjson-file', bemjsonFilename)
) {
return requireOrEval(bemjsonFilename)
.then(function (bemjson) {
var bemjsonDeps = getDepsFromBemjson(bemjson),
bemdecl = deps.toBemdecl(bemjsonDeps),
str = 'exports.blocks = ' + JSON.stringify(bemdecl, null, 4) + ';\n';

return vfs.write(bemdeclFilename, str, 'utf-8')
.then(function () {
cache.cacheFileInfo('bemdecl-file', bemdeclFilename);
cache.cacheFileInfo('bemjson-file', bemjsonFilename);
node.resolveTarget(target, { blocks: bemdecl });
});
});
} else {
node.isValidTarget(target);
dropRequireCache(require, bemdeclFilename);
var logger = this.node.getLogger();

return asyncRequire(bemdeclFilename)
.then(function (result) {
node.resolveTarget(target, result);
return null;
});
}
});
logger.logTechIsDeprecated(this._target, this.getName(), 'enb-bem', 'bemjson-to-bemdecl', 'enb-bem');
this.__base();
}
});

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 : '') : '');
}

0 comments on commit a621a15

Please sign in to comment.