- dev-declaration - генерирует
bemdecl.jsдля заданного набора сущностей; - dev-page-bemjson - генерирует
bemjsonдля отладочной страницы; - js-test - сборка бандлов с тестами;
- sandbox - сборка бандлов с кодом "песочницы";
- empty-test-result - генерация пустого результата выполнения тестов без их запуска;
- transporter - трансформация отдельных файлов цепочкой обработчиков.
Генерирует декларацию бандла (bemdecl.js), содержащю заданный список БЭМ-сущностей.
String[target] — Результирующий таргет. По умолчанию?.bemdecl.js.String[][entities] — Список имен сущностей (в соответствии с правилами именования БЭМ).
const dev = require('direct-dev');
nodeConfig.addTech([
dev.techs.devDeclaration,
{
target: '?.bemdecl.js',
entities: ['block1', 'block1__elem2']
}]);Генерирует bemjson для отладочной страницы. В результате получается файл bemjson.js, содержащий блок dev-page с заданными параметрами.
Используя полученный bemjson, можно сгенерировать HTML-разметку отладочной страницы с помощью технологии bemjson-to-html из пакета enb-bemxjst.
String[target] — Результирующий таргет. По умолчанию?.bemjson.js.String[block] — Название корневого блока. По умолчаниюdev-page.String[type] — Значение модификатораtype.String[js] — js-таргет для подключения к странице.String[devJs] — js-таргет для подключения к странице вспомогательного кода (например, тестов).String[css] — css-таргет для подключения к странице.
Если указаны значения параметров css, js, devJs, то перед сборкой bemjson отлалочной страницы будут собраны указанные таргеты.
const dev = require('direct-dev');
nodeConfig.addTech([
dev.techs.devPageBemjson,
{
target: '?.bemjson.js',
type: 'test',
js: '?.js',
devJs: '?.test.js',
css: '?.css'
}]);Собирает бандл с кодом тестов. Включает туда содержимое файлов .test.js, соответствующих заданному фильтру.
String[target] — Результирующий таргет. По умолчанию?.test.js.BlockFilter[filter] — Фильтр по названию блока и уровням переопределения. По умолчанию - не указан.
const dev = require('direct-dev');
const filter = new dev.BlockFilter(
{ targetBlock: 'block-name', targetLevels: ['source.blocks'], techs: ['js', 'jsx'] },
{ rootPath: config.getRootPath() }
);
nodeConfig.addTech([
dev.techs.jsTest,
{
target: '?.test.js',
filter: filter
}]);Собирает бандл для песочницы. Включает туда содержимое файлов .sandbox.js, обернутое в служебный код песочницы.
String[target] — Результирующий таргет. По умолчанию?.sandbox.js.BlockFilter[filter] — Фильтр по названию блока и уровням переопределения. По умолчанию - не указан.
const dev = require('direct-dev');
const filter = new dev.BlockFilter(
{ targetBlock: 'block-name', targetLevels: ['source.blocks'], techs: ['js', 'jsx'] },
{ rootPath: config.getRootPath() }
);
nodeConfig.addTech([
dev.techs.sandbox,
{
target: '?.sandbox.js',
filter: filter
}]);Технология формирует пустой файл с результатами тестов в формате технологии enb-phantom-testing. При создании можно передать параметр needCoverage - если передать значение true, в результирующий файл будет добавлен zero-coverage report (считаем, что весь код не покрыт тестами).
Данная технология нужна для получения отчета о результатах тестов без их запуска, если заранее известно, что в бандле нет тестов.
String[target] — Результирующий таргет. По умолчанию?.test-result.json.BlockFilter[filter] — Фильтр по названию блока и уровням переопределения. По умолчанию - не указан.
const dev = require('direct-dev');
// указываем, что нужно добавить в результат информацию
// о нулевом покрытии кода тестами
const needCoverage = true;
// при формировании информации о покрытии будем учитывать только
// код конкретного блока и только на заданных уровнях
const filter = new dev.BlockFilter(
{ targetBlock: 'block-name', targetLevels: ['source.blocks'] },
{ rootPath: config.getRootPath() }
);
nodeConfig.addTech([
dev.techs.emptyTestResult(needCoverage),
{
target: '?.test-result.json',
filter: filter
}]);Технология склеивает исходные файлы в один, предварительно выполняя обработку каждого отдельного файла цепочкой обработчиков.
Boolean[noCache] — Не использовать кэш.
String[target] — Результирующий таргет. По умолчанию?.merged.js.Array[sourceSuffixes] — Расширения исходных файлов, которые необходимо обработать технологией.Object|Array[apply] — Обработчик или массив обработчиков, которые будут применяться к каждому файлу.
Обработчики - это функции, получаюшие на вход поток объектов { path: 'путь-к-файлу', contents: 'строка'}, и трансформирующие его в новый поток объектов в таком же формате. После применения всех обработчиков содержимое потока склеивается в один файл и считается результатом сборки ENB-таргета.
В пакете доступны два плагина:
- coverage - инструментирует js файлы с помощью библиотеки istanbul;
- wrap - добавляет заданные строки в начало и конец обрабатываемого файла. Доступны плейсхолдеры
${relative}(относительный путь к текущему файлу) и${path}(абсолютный путь). - babel - обрабатывает выбранный файл babel-ем
Инструментирование выбранных файлов:
const dev = require('direct-dev');
const filter = file => true; // TODO: add business logic
nodeConfig.addTech([
dev.techs.transporter('js', { noCache: true }),
{
target: '?.js',
sourceSuffixes: ['utils.js', 'model.js', 'js'],
apply: [
dev.transporterPlugins.coverage({ filter }), // инструментируем только нужные файлы
dev.transporterPlugins.wrap({ // добавляем комментарии в начало и конец
before: '/* begin: ${relative} */',
after: '/* end: ${relative} */' })
]
}]);Обработка выбранных файлов babel'ем:
const dev = require('direct-dev');
const filter = file => true; // TODO: add business logic
nodeConfig.addTech([
dev.techs.transporter('js', { noCache: true }),
{
target: '?.js',
sourceSuffixes: ['utils.js', 'model.js', 'js', 'jsx'],
apply: [
dev.transporterPlugins.babel({
filter, // применем babel только к нужным файлам
babelOptions: {
//Можем использовать любые плагины для babel. Для этого их надо установить на уровне проекта
plugins: [require('babel-preset-react').plugins]
}
}),
dev.transporterPlugins.wrap({ // добавляем комментарии в начало и конец
before: '/* begin: ${relative} */',
after: '/* end: ${relative} */' })
]
}]);