From 746d6121b2a939548ec87864afd539e5ef1523c5 Mon Sep 17 00:00:00 2001 From: Alexey Yaroshevich Date: Thu, 31 Mar 2016 15:33:29 +0300 Subject: [PATCH 1/2] feat(node-configurator): add prependFiles, appendFiles options --- lib/assets/tmpl-spec.jst | 2 +- lib/node-configurator.js | 31 +++++++++++++++++++++++-------- lib/plugin.js | 4 ++++ 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/lib/assets/tmpl-spec.jst b/lib/assets/tmpl-spec.jst index 72cbbd0..181a7a5 100644 --- a/lib/assets/tmpl-spec.jst +++ b/lib/assets/tmpl-spec.jst @@ -80,7 +80,7 @@ function loadTemplate(file, exportName) { return { apply: function() { return e.stack; } }; } } -function reRequire(file, exportName) { +function reRequire(file) { file = require.resolve(file); clearRequire(file); return require(file); diff --git a/lib/node-configurator.js b/lib/node-configurator.js index 065de2f..f61af87 100644 --- a/lib/node-configurator.js +++ b/lib/node-configurator.js @@ -37,6 +37,8 @@ exports.configure = function (config, options) { config.nodes(pattern, function (nodeConfig) { var langs = options.langs, engines = options.engines, + prependFiles = [].concat(options.prependFiles).filter(Boolean), + appendFiles = [].concat(options.appendFiles).filter(Boolean), coverageEngines = options.coverage.engines, engineTargets = [], specTargets = [], @@ -70,17 +72,23 @@ exports.configure = function (config, options) { [files] ]); - // Add engines' techs + // Provide prepending and appending files if any. + prependFiles.concat(appendFiles) + .forEach(function (filepath) { + nodeConfig.addTech([provide, { target: filepath }]); + }); + + // Add engines' techs and set needsCoverage flag engines.forEach(function (engine) { engine.hasOwnProperty('needsCoverage') || (engine.needsCoverage = _.contains(coverageEngines, engine.name)); nodeConfig.addTech([engine.tech, engine.options]); }); // For each lang including no-lang (false) and mock-lang (true) - (Array.isArray(langs) ? langs : [langs && 'lang']).forEach(function (lang) { - var suffix = '.' + lang + '.js', - isMock = lang === 'lang', - isReal = lang && !isMock; + (Array.isArray(langs) ? langs : [langs && 'mock']).forEach(function (lang) { + var isMock = lang === 'mock', + isReal = !isMock && typeof lang === 'string', + suffix = '.' + (lang || 'merged') + '.js'; // Keyset and lang file for real langs: isReal && nodeConfig.addTechs([ @@ -95,14 +103,21 @@ exports.configure = function (config, options) { engines.forEach(function (engine) { var target = engine.target, - destTarget = target; + destTarget = target, + sources = [] + .concat(prependFiles) + .concat(lang && ('?.lang' + suffix)) + .concat(target) + .concat(appendFiles) + .filter(Boolean); // Skip block for `langs: false` - if (lang) { + // or if we don't need prepending/appending files. + if (lang || sources.length > 1) { destTarget = target.replace('.js', suffix); nodeConfig.addTech([mergeFile, { - sources: ['?.lang' + suffix, target], + sources: sources, target: destTarget, sourcemap: true }]); diff --git a/lib/plugin.js b/lib/plugin.js index 1405714..08ee2e6 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -68,6 +68,8 @@ module.exports = function (helper, commonOpts) { }), langs: options.langs, mockI18N: options.mockI18N, + prependFiles: options.prependFiles, + appendFiles: options.appendFiles, engines: _.map(engines, function (engine, name) { var techPath = engine.tech, tech = require(techPath), @@ -174,6 +176,8 @@ module.exports = function (helper, commonOpts) { sourceLevels: options.sourceLevels, langs: options.langs, mockI18N: options.mockI18N, + prependFiles: options.prependFiles, + appendFiles: options.appendFiles, engines: options.engines, saveHtml: options.saveHtml, coverage: options.coverage, From 58fd5fe9fd09e30727f3b70c295cff7d80ffe39e Mon Sep 17 00:00:00 2001 From: Alexey Yaroshevich Date: Thu, 31 Mar 2016 16:33:35 +0300 Subject: [PATCH 2/2] docs(readme): add options prependFiles, appendFiles --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5019865..0d1aa81 100644 --- a/README.md +++ b/README.md @@ -224,6 +224,8 @@ module.exports = function (config) { * *String[]* `referenceDirSuffixes` — суффиксы папок технологий с эталонами. По умолчанию — `['tmpl-specs']`. * *String[] | Boolean* `langs` —  использование `BEM.I18N` в шаблонах. Если указать массив языков, то необходимо будет создавать эталоны на каждый из перечисленных языков. Например `10-name.ru.bemjson.js` , `10-name.en.bemjson.js`. Если использовать значение `langs: true`, то эталоны по языкам писать не нужно. В код собранных шаблонов будет всталенно только ядро BEM.I18N, без кейсетов. По умолчанию — `false`. +* *String[]* `prependFiles` — опция позволяет указать набор файлов для подмешивания в начало тестируемых шаблонов. +* *String[]* `appendFiles` — опция позволяет указать набор файлов для подмешивания в конец тестируемых шаблонов. * *Object* `engines` —  опция определяет какие ENB-технологии следует использовать для сборки шаблонов. Обязательная опция. - *String* `tech` — путь к ENB-технологии; - *Object* `options` — опции для ENB-технологии;