From c9f99f88a40ca25ee29a5e537c93921d5aee39e7 Mon Sep 17 00:00:00 2001 From: Vladimir Alaev Date: Thu, 12 Sep 2013 06:14:32 -0700 Subject: [PATCH] Merge pull request #430 from bem/BEM-931 Add ability to write level config module as a function (closes #364, BEM-931) --- lib/level.js | 14 +++++ test/data/make/project/pages/.bem/level.js | 61 +++++++++++----------- 2 files changed, 45 insertions(+), 30 deletions(-) diff --git a/lib/level.js b/lib/level.js index eb4b92b3..49a07ef1 100644 --- a/lib/level.js +++ b/lib/level.js @@ -8,8 +8,22 @@ var PATH = require('./path'), LOGGER = require('./logger'), isRequireable = bemUtil.isRequireable, + BEM, + + // Use this as a function because of circular dependency which occurs + // if require is placed in the global scope of the module. BEM is also cached + // in a var to avoid require call every time (which is much slower than if statement. + getBem = function() { + if (!BEM) BEM = require('..'); + + return BEM; + }, + getLevelClass = function(path, optional) { var level = optional && !isRequireable(path) ? {} : requireLevel(path); + + if (typeof level === 'function') level = level(getBem()); + if (level.Level) return level.Level; return INHERIT(level.baseLevelPath? getLevelClass(level.baseLevelPath) : Level, level); }, diff --git a/test/data/make/project/pages/.bem/level.js b/test/data/make/project/pages/.bem/level.js index 10a1e177..d553c9e7 100644 --- a/test/data/make/project/pages/.bem/level.js +++ b/test/data/make/project/pages/.bem/level.js @@ -1,36 +1,37 @@ -var BEM = require('../../..'), - PATH = require('path'), - extend = BEM.util.extend, +module.exports = function(BEM) { - BEM_TECHS = '../../bem-bl/blocks-common/i-bem/bem/techs', - PRJ_TECHS = '../../.bem/techs'; + var PATH = require('path'), + extend = BEM.util.extend, -exports.getTechs = function() { + BEM_TECHS = '../../bem-bl/blocks-common/i-bem/bem/techs'; return { - 'bemjson.js': '', - 'deps.js': 'v2/deps.js', - 'js': 'v2/js-i', - 'css': 'v2/css', - 'ie.css': 'v2/ie.css', - 'i18n': PATH.join(BEM_TECHS, 'v2/i18n.js'), - 'i18n.js': PATH.join(BEM_TECHS, 'v2/i18n.js.js'), - 'bemhtml': PATH.join(BEM_TECHS, 'v2/bemhtml.js'), - 'html': PATH.join(BEM_TECHS, 'html.js') + getTechs: function() { + + return { + 'bemjson.js': '', + 'deps.js': 'v2/deps.js', + 'js': 'v2/js-i', + 'css': 'v2/css', + 'ie.css': 'v2/ie.css', + 'i18n': PATH.join(BEM_TECHS, 'v2/i18n.js'), + 'i18n.js': PATH.join(BEM_TECHS, 'v2/i18n.js.js'), + 'bemhtml': PATH.join(BEM_TECHS, 'v2/bemhtml.js'), + 'html': PATH.join(BEM_TECHS, 'html.js') + }; + }, + + getConfig: function() { + + return extend({}, this.__base() || {}, { + + bundleBuildLevels: this.resolvePaths([ + '../../bem-bl/blocks-common', + '../../bem-bl/blocks-desktop', + '../../blocks' + ]) + + }); + } }; - -}; - -exports.getConfig = function() { - - return extend({}, this.__base() || {}, { - - bundleBuildLevels: this.resolvePaths([ - '../../bem-bl/blocks-common', - '../../bem-bl/blocks-desktop', - '../../blocks' - ]) - - }); - };