Skip to content
Alexej Yaroshevich edited this page Aug 25, 2016 · 9 revisions

Общий алгоритм

  • построение графа
    • walkerом составляем список всех файлов
      • передаем настройки уровней со схемами именования/вложенности (bem-config) и набор уровней для прохода (массив строк)
      • получаем неупорядоченный поток объектов, описывающий файл и тенорок, к которому он относится: {level: String, path: String, entity: BemEntityName, tech: String}
      • схемы содержат алгоритм обхода уровня и влияют на то, какие файлы вернутся
    • из общего потока файлов оставляем только файлы описания зависимостей (далее ФОЗ)
    • из каждого ФОЗ получаем нормализованный список зависимостей
      • чтение и нормализация ФОЗ происходит с помощью обработчика для нужного формата
      • итоговый формат: Array<{vertex: {entity, tech}, dependOn: {entity, tech}, ordered}>
    • строим граф по всем полученным связям между сущностями используя bem-graph
  • работаем с графом
    • получаем упорядоченный набор «тенорков» для сборки по декларации и технологии для сборки бандлов
    • по нему получаем упорядоченный набор файлов сортированный в соответствии с уровнями переопределения
    • передаем всё в руки пользователя

Обработчик формата new-deps.js

  • Читаем и эвалим файл в JS-объект в формате deps.js
  • Валидируем формат (можно отключить)
  • Нормализуем синтаксис (приводим к формату DepsCollection)
    • Нормализуем в структуру дерева
      • Заворачиваем содержимое файлов в корневой узел {shouldDeps: …}
      • Нормализуем структуру связей для каждого узла, начиная с корневого: трансформируем единичные значения shouldDeps/mustDeps в массивы, для каждого нестрокового элемента массива повторяем.
  • Делаем из дерева неупорядоченный плоский список
    • Нормализуем синтаксис узлов в полную форму ({block: ?String, elem: ?ElemEntity[], elems: ?ElemEntity[], mod: ?String, val: ?String, mods: ?Object}) — результатом является дерево нормализованных масок.
    • Раскрываем маски тенорков ([{block: ?String, elem: ?String, modName: ?String, modVal: ?String}]) — получаем дерево массивов тенорков.
    • Для каждого тенорка в каждом узле:
      • Получаем список зависимых тенорков
      • Наполняем их скоупом текущего тенорка в порядке спуска по дереву
    • Добавляем зависимость для текущего тенорка в результирующий плоский список
    • ?
  • Формируем список зависимостей в итоговом формате
  • Наполняем контекстом файла

NB: ФОЗ (файл описания зависимостей) — сущность файловой системы (файл или папка), содержащая информацию о зависимостях.

NB: Рекурсивную нормализованную структуру ФОЗ можно описать следующим образом:

DepsCollection = Array<DepsItem>
DepsItem = {
  tech: ?String,
  block: ?String,
  elem: ?String,
  mod: ?String,
  val: ?String,
  shouldDeps: ?DepsCollection,
  mustDeps: ?DepsCollection
}

NB: noDeps RIP.

Clone this wiki locally