diff --git a/README.md b/README.md
index 6ba6429..728e8ff 100644
--- a/README.md
+++ b/README.md
@@ -34,7 +34,7 @@ $ npm install --save-dev enb-bh
* *String* **filesTarget** — files-таргет, на основе которого получается список исходных файлов (его предоставляет технология `files`). По умолчанию — `?.files`.
* *String* **sourceSuffixes** — суффиксы файлов, по которым строится `files`-таргет. По умолчанию — `['bh.js']`.
* *Boolean* **sourcemap** — строить карты кода.
-* *String* **mimic** — имя переменной для экспорта.
+* *String|Array* **mimic** — имена переменных для экспорта.
* *String* **jsAttrName** — атрибут блока с параметрами инициализации. По умолчанию — `onclick`.
* *String* **jsAttrScheme** — Схема данных для параметров инициализации. По умолчанию — `js`. Форматы: `js` — Получаем `return { ... }`. `json` — JSON-формат. Получаем `{ ... }`.
@@ -54,7 +54,7 @@ nodeConfig.addTech(require('enb-bh/techs/bh-client'));
* *String* **filesTarget** — files-таргет, на основе которого получается список исходных файлов (его предоставляет технология `files`). По умолчанию — `?.files`.
* *String* **sourceSuffixes** — суффиксы файлов, по которым строится `files`-таргет. По умолчанию — `['bh.js']`.
* *Boolean* **sourcemap** — строить карты кода.
-* *String* **mimic** — имя модуля для экспорта.
+* *String|Array* **mimic** — имена модулей для экспорта.
* *String* **jsAttrName** — атрибут блока с параметрами инициализации. По умолчанию — `onclick`.
* *String* **jsAttrScheme** — Схема данных для параметров инициализации. По умолчанию — `js`. Форматы: `js` — Получаем `return { ... }`. `json` — JSON-формат. Получаем `{ ... }`.
@@ -73,6 +73,7 @@ nodeConfig.addTech(require('enb-bh/techs/bh-client-module'));
* *String* **target** — Результирующий таргет. По умолчанию — `?.bh.js`.
* *String* **filesTarget** — files-таргет, на основе которого получается список исходных файлов (его предоставляет технология `files`). По умолчанию — `?.files`.
* *String* **sourceSuffixes** — суффиксы файлов, по которым строится `files`-таргет. По умолчанию — `['bh.js']`.
+* *String|Array* **mimic** — имена переменных для экспорта.
* *String* **jsAttrName** — атрибут блока с параметрами инициализации. По умолчанию — `onclick`.
* *String* **jsAttrScheme** — Схема данных для параметров инициализации. По умолчанию — `js`. Форматы: `js` — Получаем `return { ... }`. `json` — JSON-формат. Получаем `{ ... }`.
@@ -92,6 +93,7 @@ nodeConfig.addTech(require('enb-bh/techs/bh-server'));
* *String* **filesTarget** — files-таргет, на основе которого получается список исходных файлов (его предоставляет технология `files`). По умолчанию — `?.files`.
* *String* **sourceSuffixes** — суффиксы файлов, по которым строится `files`-таргет. По умолчанию — `['bh.js']`.
* *Boolean* **sourcemap** — строить карты кода.
+* *String|Array* **mimic** — имена переменных для экспорта.
* *String* **jsAttrName** — атрибут блока с параметрами инициализации. По умолчанию — `onclick`.
* *String* **jsAttrScheme** — Схема данных для параметров инициализации. По умолчанию — `js`. Форматы: `js` — Получаем `return { ... }`. `json` — JSON-формат. Получаем `{ ... }`.
diff --git a/lib/bh-client-processor.js b/lib/bh-client-processor.js
index 7e7421f..936626d 100644
--- a/lib/bh-client-processor.js
+++ b/lib/bh-client-processor.js
@@ -19,7 +19,7 @@ module.exports = {
* @param {Object} dependencies example: {libName: "dependencyName"}
* @param {String} jsAttrName
* @param {String} jsAttrScheme
- * @param {String} mimic
+ * @param {String|Array} mimic
* @returns {string}
*/
buildModule: function (targetPath, bhEngine, inputSources, dependencies, jsAttrName, jsAttrScheme,
@@ -29,7 +29,9 @@ module.exports = {
this._defineModule('bh', file, dependencies, bhEngine, inputSources, jsAttrName, jsAttrScheme, true);
if (mimic) {
- this._defineModule(mimic, file, { bh: 'bh' });
+ [].concat(mimic).forEach(function (name) {
+ this._defineModule(name, file, { bh: 'bh' });
+ }, this);
}
return file;
@@ -43,7 +45,7 @@ module.exports = {
* @param {String} jsAttrName
* @param {String} jsAttrScheme
* @param {Boolean} useSourceMap
- * @param {String} mimic
+ * @param {String|Array} mimic
* @returns {string}
*/
build: function (targetPath, bhEngine, inputSources, dependencies, jsAttrName, jsAttrScheme, useSourceMap, mimic) {
@@ -67,7 +69,7 @@ module.exports = {
* @param {Object} dependencies example: {libName: "dependencyName"}
* @param {String} jsAttrName
* @param {String} jsAttrScheme
- * @param {String} [mimic]
+ * @param {String|Array} [mimic]
* @returns {Object} enb-source-map/lib/file instance
*/
_concatFile: function (file, bhEngine, inputSources, dependencies, jsAttrName, jsAttrScheme, mimic) {
@@ -81,9 +83,11 @@ module.exports = {
file.writeLine('});');
if (mimic) {
- file.writeLine('if (typeof ' + mimic + ' === \'undefined\') {');
- file.writeLine('var ' + mimic + ' = bh;');
- file.writeLine('}');
+ [].concat(mimic).forEach(function (name) {
+ file.writeLine('if (typeof ' + name + ' === \'undefined\') {');
+ file.writeLine('var ' + name + ' = bh;');
+ file.writeLine('}');
+ });
}
libPrepares.forEach(function (libPrepare) {
diff --git a/techs/bh-client-module.js b/techs/bh-client-module.js
index 6a13747..19c24b7 100644
--- a/techs/bh-client-module.js
+++ b/techs/bh-client-module.js
@@ -12,7 +12,7 @@
* (его предоставляет технология `files`). По умолчанию — `?.files`.
* * *String* **sourceSuffixes** — суффиксы файлов, по которым строится `files`-таргет. По умолчанию — ['bh'].
* * *Boolean* **sourcemap** — строить карты кода.
- * * *String* **mimic** — имя модуля для экспорта.
+ * * *String|Array* **mimic** — имена модулей для экспорта.
* * *String* **jsAttrName** — атрибут блока с параметрами инициализации. По умолчанию — `onclick`.
* * *String* **jsAttrScheme** — Cхема данных для параметров инициализации. По умолчанию — `js`.
* * Форматы:
@@ -35,7 +35,7 @@ module.exports = require('enb/lib/build-flow').create()
.target('target', '?.bh.client.js')
.defineOption('bhFile', '')
.defineOption('dependencies', {})
- .defineOption('mimic')
+ .defineOption('mimic', [])
.defineOption('jsAttrName', 'onclick')
.defineOption('jsAttrScheme', 'js')
.defineOption('sourcemap', false)
diff --git a/techs/bh-client.js b/techs/bh-client.js
index 4d67b80..10ae74e 100644
--- a/techs/bh-client.js
+++ b/techs/bh-client.js
@@ -11,7 +11,7 @@
* (его предоставляет технология `files`). По умолчанию — `?.files`.
* * *String* **sourceSuffixes** — суффиксы файлов, по которым строится `files`-таргет. По умолчанию — ['bh'].
* * *Boolean* **sourcemap** — строить карты кода.
- * * *String* **mimic** — имя переменной для экспорта.
+ * * *String|Array* **mimic** — имена переменных для экспорта.
* * *String* **jsAttrName** — атрибут блока с параметрами инициализации. По умолчанию — `onclick`.
* * *String* **jsAttrScheme** — Cхема данных для параметров инициализации. По умолчанию — `js`.
* * Форматы:
@@ -35,7 +35,7 @@ module.exports = require('enb/lib/build-flow').create()
.target('target', '?.bh.client.js')
.defineOption('bhFile', '')
.defineOption('dependencies', {})
- .defineOption('mimic')
+ .defineOption('mimic', [])
.defineOption('jsAttrName', 'onclick')
.defineOption('jsAttrScheme', 'js')
.defineOption('sourcemap', false)
diff --git a/techs/bh-server-include.js b/techs/bh-server-include.js
index b235fb0..9f2fd82 100644
--- a/techs/bh-server-include.js
+++ b/techs/bh-server-include.js
@@ -12,6 +12,7 @@
* (его предоставляет технология `files`). По умолчанию — `?.files`.
* * *String* **sourceSuffixes** — суффиксы файлов, по которым строится `files`-таргет. По умолчанию — ['bh'].
* * *Boolean* **sourcemap** — строить карты кода.
+ * * *String|Array* **mimic** — имена модулей для экспорта.
* * *String* **jsAttrName** — атрибут блока с параметрами инициализации. По умолчанию — `onclick`.
* * *String* **jsAttrScheme** — Cхема данных для параметров инициализации. По умолчанию — `js`.
* * Форматы:
@@ -34,6 +35,7 @@ module.exports = require('enb/lib/build-flow').create()
.name('bh-server-include')
.target('target', '?.bh.js')
.defineOption('bhFile', '')
+ .defineOption('mimic', [])
.defineOption('jsAttrName', 'onclick')
.defineOption('jsAttrScheme', 'js')
.defineOption('sourcemap', false)
@@ -49,6 +51,7 @@ module.exports = require('enb/lib/build-flow').create()
.builder(function (bhFiles) {
var node = this.node,
dependencies = {},
+ mimic = this._mimic,
jsAttrName = this._jsAttrName,
jsAttrScheme = this._jsAttrScheme,
sourcemap = this._sourcemap,
@@ -75,6 +78,12 @@ module.exports = require('enb/lib/build-flow').create()
file.writeLine('module.exports = bh;');
+ if (mimic) {
+ [].concat(mimic).forEach(function (name) {
+ file.writeLine('bh[\'' + name + '\'] = bh;');
+ });
+ }
+
return file.render();
});
})
diff --git a/techs/bh-server.js b/techs/bh-server.js
index b91d8cc..e89d6ea 100644
--- a/techs/bh-server.js
+++ b/techs/bh-server.js
@@ -12,6 +12,7 @@
* * *String* **filesTarget** — files-таргет, на основе которого получается список исходных файлов
* (его предоставляет технология `files`). По умолчанию — `?.files`.
* * *String* **sourceSuffixes** — суффиксы файлов, по которым строится `files`-таргет. По умолчанию — ['bh.js'].
+ * * *String|Array* **mimic** — имена модулей для экспорта.
* * *String* **jsAttrName** — атрибут блока с параметрами инициализации. По умолчанию — `onclick`.
* * *String* **jsAttrScheme** — Cхема данных для параметров инициализации. По умолчанию — `js`.
* * Форматы:
@@ -31,6 +32,7 @@ module.exports = require('enb/lib/build-flow').create()
.name('bh-server')
.target('target', '?.bh.js')
.defineOption('bhFile', '')
+ .defineOption('mimic', [])
.defineOption('jsAttrName', 'onclick')
.defineOption('jsAttrScheme', 'js')
.useFileList(['bh.js'])
@@ -97,7 +99,10 @@ module.exports = require('enb/lib/build-flow').create()
return buildRequire(file.fullname, '', '(bh)');
}).join('\n'),
'',
- 'module.exports = bh;'
+ 'module.exports = bh;',
+ this._mimic ? [].concat(this._mimic).map(function (name) {
+ return 'bh[\'' + name + '\'] = bh;';
+ }).join('\n') : ''
].join('\n');
})
.createTech();
diff --git a/test/techs/bh-client-module.test.js b/test/techs/bh-client-module.test.js
index 2f76a62..08a32f7 100644
--- a/test/techs/bh-client-module.test.js
+++ b/test/techs/bh-client-module.test.js
@@ -52,23 +52,45 @@ describe('bh-client-module', function () {
return runTest(test, options);
});
- it('mimic', function () {
- var test = [
- 'chai.should();',
- 'describe("bh-client-module", function () {',
- 'it("autogenerated test", function (done) {',
- 'modules.require("BEMHTML", function (BEMHTML) {',
- 'BEMHTML.apply({ block: "block" }).should.equal(\'\');',
- 'done();',
+ describe('mimic', function () {
+ it('mimic as a string', function () {
+ var test = [
+ 'chai.should();',
+ 'describe("bh-client-module", function () {',
+ 'it("autogenerated test", function (done) {',
+ 'modules.require("BEMHTML", function (BEMHTML) {',
+ 'BEMHTML.apply({ block: "block" }).should.equal(\'\');',
+ 'done();',
+ '});',
'});',
- '});',
- '});'
- ].join('\n'),
- options = {
- mimic: 'BEMHTML'
- };
+ '});'
+ ].join('\n'),
+ options = {
+ mimic: 'BEMHTML'
+ };
+
+ return runTest(test, options);
+ });
- return runTest(test, options);
+ it('mimic to different template engines', function () {
+ var test = [
+ 'chai.should();',
+ 'describe("bh-client-module", function () {',
+ 'it("autogenerated test", function (done) {',
+ 'modules.require(["BEMHTML", "render"], function (BEMHTML, render) {',
+ 'BEMHTML.apply({ block: "block" }).should.equal(\'\');',
+ 'render.apply({ block: "block" }).should.equal(\'\');',
+ 'done();',
+ '});',
+ '});',
+ '});'
+ ].join('\n'),
+ options = {
+ mimic: ['BEMHTML', 'render']
+ };
+
+ return runTest(test, options);
+ });
});
describe('jsAttr', function () {
diff --git a/test/techs/bh-client.test.js b/test/techs/bh-client.test.js
index bcb4420..b3be340 100644
--- a/test/techs/bh-client.test.js
+++ b/test/techs/bh-client.test.js
@@ -67,6 +67,41 @@ describe('bh-client', function () {
return runTest(test, options);
});
+ describe('mimic', function () {
+ it('mimic as a string', function () {
+ var test = [
+ 'chai.should();',
+ 'describe("bh-client", function () {',
+ 'it("autogenerated test", function () {',
+ 'BEMHTML.apply({ block: "block" }).should.equal(\'\');',
+ '})',
+ '})'
+ ].join('\n'),
+ options = {
+ mimic: 'BEMHTML'
+ };
+
+ return runTest(test, options);
+ });
+
+ it('mimic to different template engines', function () {
+ var test = [
+ 'chai.should();',
+ 'describe("bh-client", function () {',
+ 'it("autogenerated test", function () {',
+ 'BEMHTML.apply({ block: "block" }).should.equal(\'\');',
+ 'render.apply({ block: "block" }).should.equal(\'\');',
+ '})',
+ '})'
+ ].join('\n'),
+ options = {
+ mimic: ['BEMHTML', 'render']
+ };
+
+ return runTest(test, options);
+ });
+ });
+
describe('jsAttr', function () {
it('should use dafault jsAttrName and jsAttrScheme params', function () {
var test = generateTest(
diff --git a/test/techs/bh-server-include.test.js b/test/techs/bh-server-include.test.js
index 77e1cbc..e76c376 100644
--- a/test/techs/bh-server-include.test.js
+++ b/test/techs/bh-server-include.test.js
@@ -81,6 +81,30 @@ describe('bh-server-include', function () {
return assert(bemjson, html, templates);
});
+ describe('mimic', function () {
+ it('mimic to BEMHTML', function () {
+ var templates = [
+ 'bh.match("block", function(ctx) {ctx.tag("a");});'
+ ],
+ bemjson = { block: 'block' },
+ html = '',
+ options = { mimic: 'BEMHTML' };
+
+ return assert(bemjson, html, templates, options);
+ });
+
+ it('mimic as an array', function () {
+ var templates = [
+ 'bh.match("block", function(ctx) {ctx.tag("a");});'
+ ],
+ bemjson = { block: 'block' },
+ html = '',
+ options = { mimic: ['BH', 'BEMHTML'] };
+
+ return assert(bemjson, html, templates, options);
+ });
+ });
+
describe('caches', function () {
it('must use cached bhFile', function () {
var scheme = {
@@ -254,5 +278,9 @@ function assert(bemjson, html, templates, options) {
return bundle.runTechAndRequire(bhServerInclude, options)
.spread(function (bh) {
bh.apply(bemjson).must.be(html);
+
+ options && options.mimic && [].concat(options.mimic).forEach(function (name) {
+ bh[name].apply(bemjson).must.be(html);
+ });
});
}
diff --git a/test/techs/bh-server.test.js b/test/techs/bh-server.test.js
index 4bd72c8..fa6eee5 100644
--- a/test/techs/bh-server.test.js
+++ b/test/techs/bh-server.test.js
@@ -115,6 +115,30 @@ describe('bh-server', function () {
});
});
+ describe('mimic', function () {
+ it('mimic to BEMHTML', function () {
+ var templates = [
+ 'bh.match("block", function(ctx) {ctx.tag("a");});'
+ ],
+ bemjson = { block: 'block' },
+ html = '',
+ options = { mimic: 'BEMHTML' };
+
+ return assert(bemjson, html, templates, options);
+ });
+
+ it('mimic as an array', function () {
+ var templates = [
+ 'bh.match("block", function(ctx) {ctx.tag("a");});'
+ ],
+ bemjson = { block: 'block' },
+ html = '',
+ options = { mimic: ['BH', 'BEMHTML'] };
+
+ return assert(bemjson, html, templates, options);
+ });
+ });
+
describe('caches', function () {
it('must use cached bhFile', function () {
var scheme = {
@@ -263,5 +287,9 @@ function assert(bemjson, html, templates, options) {
return bundle.runTechAndRequire(bhServer, options)
.spread(function (bh) {
bh.apply(bemjson).must.be(html);
+
+ options && options.mimic && [].concat(options.mimic).forEach(function (name) {
+ bh[name].apply(bemjson).must.be(html);
+ });
});
}