bem-site/gorshochek

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# Gorshochek

Набор плагинов сборки данных для BEM сайтов.

[![NPM version](http://img.shields.io/npm/v/gorshochek.svg?style=flat)](http://www.npmjs.org/package/gorshochek)
[![Coveralls branch](https://img.shields.io/coveralls/bem-site/gorshochek/master.svg)](https://coveralls.io/r/bem-site/gorshochek?branch=master)
[![Travis](https://img.shields.io/travis/bem-site/gorshochek.svg)](https://travis-ci.org/bem-site/gorshochek)
[![Code Climate](https://codeclimate.com/github/bem-site/gorshochek/badges/gpa.svg)](https://codeclimate.com/github/bem-site/gorshochek)
[![David](https://img.shields.io/david/bem-site/gorshochek.svg)](https://david-dm.org/bem-site/gorshochek)
![](https://reposs.herokuapp.com/?path=bem-site/gorshochek&style=flat)

Модуль сборки данных для bem сайтов.



![GitHub Logo](./.logo.jpg)

## Установка

Пакет устанавливается как обычная npm зависимость:
```
$ npm install --save gorshochek
```

## Примеры использования

Простой запуск сборки путем последовательного выполнения всех необходимых задач: [пример](./examples/native-full.js).

Запуск с помощью [gulp](https://npmjs.org/package/gulp) можно посмотреть [здесь](./examples/gulp-full.js).

## Спецификация модели данных

Модель данных описывается в JSON-файле, который должен содержать массив объектов, каждый из которых представляет
собой совокупность мета-данных для определенной страницы сайта. Пример такой структуры приведен ниже:
```json
[
 {
    "url": "/",
    "site": "/",
    "title": "БЭМ",
    "content": "БЭМ прекрасен"
  },
  {
    "url": "/methodology/",
    "site": "/methodology/",
    "title": "Методология",
    "source": "./examples/bemjson/methodology.ru.bemjson.js",
    "type": "bemjson.js"
  },
  ...
]  
```

Каждый объект в массиве страниц модели может иметь следующий набор полей:

#### url

Url страницы в браузере.
* Тип данных: `String`
* Обязательное поле 
* Должно быть уникальным
* Должно заканчиваться символом `/`

#### site

Url раздела сайта для страницы
* Тип данных: `String`
* Обязательное поле
* Должно заканчиваться символом `/`

#### title

Заголовок страницы. Будет использован при построении меню, хлебных крошек, тега `<title>` страницы и т. д.
* Тип данных: `String`
* Обязательное поле

#### published

Флаг страницы, при указании которого в false страница будет исключена из сборки.
* Тип данных: `Boolean`
* Значение по умолчанию: `true`

#### content

Контент страницы. Может быть использован для страниц, у которых есть небольшой неизменяемый контент.
* Тип данных: `String`
* Значение по умолчанию: нет

#### source

Ccылка на источник, с которого будет загружен контент для страницы. 
Может быть относительной (относительно рабочей директории проекта) ссылкой 
на файл локальной файловой системы или http-ресурс.
* Тип данных: `String`
* Значение по умолчанию: нет

Примеры:
* `./examples/bemjson/methodology.ru.bemjson.js`
* `https://github.com/bem-site/gorshochek/README.md`

#### type

Тип данных страницы, например: `bemjson.js`. Используется при шаблонизации страниц.
* Тип данных: `String`
* Значение по умолчанию: нет

#### bundle

Имя BEM-бандла для сборки страниц.
* Тип данных: `String`
* Значение по умолчанию: `index`

#### tags

Массив тегов для страницы, для которых могут быть построены соответствующие страницы.
* Тип данных: `String[]`
* Значение по умолчанию: `[]`

## Создание собственной задачи сборки

Задача сборки представляет собой функцию высшего порядка, т. е. возвращающую другую анонимную функцию,
без аргументов реализующую логику задачи.

Любая задача сборки, работающая с моделью, должна принимать ее экземпляр в качестве первого аргумента.
Кроме того, задача может включать в себя дополнительные опции, которые удобно передать в виде объекта вторым параметром.
Для организации задач в виде цепочки промисов возвращаемая анонимная функция должна сама возвращать промис-объект.

Таким образом требования, описанные выше, позволяют записать код простейшей задачи, которая
выводит в консоль параметр `name`, переданный ей в качестве опции:

```js
module.exports = function(model, options = {}) {
    return function() {
        console.log('Hello ' + options.name);
        return Promise.resolve(model);
    }
}
```

## Тестирование

Запуск тестов с вычислением покрытия кода тестами с помощью инструмента [istanbul](https://www.npmjs.com/package/istanbul):
```bash
npm test
```

Проверка синтаксиса кода с помощью [eslint](http://eslint.org) и [jscs](https://www.npmjs.com/package/jscs)
```bash
npm run lint
```

Особая благодарность за помощь в разработке:

* Гриненко Владимир (http://github.com/tadatuta)
* Харисов Виталий (https://github.com/vithar)

Разработчик Кузнецов Андрей Серргеевич @tormozz48
Вопросы и предложения присылать по адресу: andrey.kuznetsov48@yandex.ru