-
Notifications
You must be signed in to change notification settings - Fork 0
deps description
deps.js файл описывает зависимости между БЭМ-сущностями (с указанием технологий или без).
Зависимости описываются с помощью deps-сущностей - в нормализованном виде (без синтаксического сахара):
DepsEntity = {
block : ?String,
elem : ?String,
mod : ?String,
val : ?(String|true),
tech : ?String,
mustDeps : ?(DepsEntity|Array<DepsEntity>),
shouldDeps : ?(DepsEntity|Array<DepsEntity>),
noDeps : ?(DepsEntity|Array<DepsEntity>),
include : ?false
}
- Поля, определяющие БЭМ-сущность (
block
,elem
,mod
,val
), восстанавливаются из контекста (текущий файл БЭМ-сущности или родительская deps-сущность) слева направо:
- На вход получаем родительский и текущий узлы.
- Проверяем в узле поле
block
, если есть — выходим, иначе — наполняем полеblock
из родительского узла. - Проверяем в узле поле
elem
, если есть — выходим, иначе — наполняем полеelem
из родительского узла. - Для
mod
иval
по аналогии.
- Поле
tech
позволяет описать зависимость между реализациями БЭМ-сущностей для конкретных технологий. В случае, когдаtech
не указана, зависимость называется общей и относится ко всем технологиям. Случаи, при указанииtech
только с одной стороны, разрешаются следующим образом:
- Когда явно указанная технология зависит от общей, общая используется с тем же значением, что и явная.
- Когда общая технология зависит от явной, то общая используется со значением собираемой технологии.
- Поле
include: false
позволяет описать зависимость без подключения зависимой БЭМ-сущности. Пример:
({
block: 'foo',
shouldDeps: {
include: false,
block: 'bar',
mustDeps: { block: 'baz' }
}
})
// Интерпретации:
// - если появится bar, использовать дугу bar-mustDeps-baz
// - foo не зависит от bar, мы просто описываем зависимость bar-mustDeps-baz в foo.deps.js
- Поля
*Deps
- Есть входная декларация (набор БЭМ сущностей) bemdecl.js файл
- Цикл по каждой БЭМ-сущности (сущности упорядочены)
- цикл по уровням переопределения (уровни упорядочены) для данной БЭМ-сущности
(*)
- читаем deps.js
- обходим deps-сущности по порядку
- обходим зависимости каждой deps-сущности в порядке:
mustDeps, shouldDeps, noDeps
(**)
- добавляем
mustDeps/shouldDeps
-стрелки в аккумулятор - удаляем стрелки по
noDeps
из аккумулятора - для каждой зависимой deps-сущности продолжаем обход в глубину
(*)
и(**)
- добавляем
- цикл по уровням переопределения (уровни упорядочены) для данной БЭМ-сущности
- Граф зависимостей в аккумуляторе разворачивается в цепочку - массив всех необходимых БЭМ-сущностей
-
elem: String[] раскрывается в массив deps-сущностей элементов с сохранением полей
block
,mod
,val
,tech
,*Deps
иinclude
(deps-сущность блока в него не входит). -
elems: Array раскрывается в основную deps-сущность с полями
block
,mod
,val
иtech
, и дополняет полеshouldDeps
основной deps-сущности deps-сущностями элементов. Поддерживается синтаксический сахар: вместо DepsEntity можно использовать строку ('elemName'
), эквивалентную{ elem: 'elemName' }
. Вместо массива из 1 элемента допустимо использовать сам элемент без оборачивания в массив. -
mods: Object — представляет из себя объект, ключами которого являются имена модификаторов, значениями — значения, и раскрывается в основную deps-сущность с полями
block
,elem
,tech
,*Deps
, с дополненными полемshouldDeps
описываемыми модификаторами в виде deps-сущностей. В значениях допустимо использовать строки или значение true, а так же массивы строк