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); + }); }); }