bem / bem-bl

Base BEM library
http://bem.github.com/bem-bl/
197 stars 83 forks source link

js+bemhtml: Tech to build js with bemhtml templates #227

Closed arikon closed 11 years ago

arikon commented 12 years ago

We need tech module to build .js files for bundles that include bemhtml templates to render html from bemjson in the browser.

To build such a file we need to build js part using common deps, build bemhtml.js part using techByDeps.js.bemhtml parf of deps and concatenate the result.

exports.deps = [
    // common deps goes here
];

exports.depsByTech = {

    js: {
        bemhtml: [
            // bemhtml deps for js tech goes here
        ]
    }

};
arikon commented 11 years ago

Should take js-bemhtml tech from realty project as a prototype

arikon commented 11 years ago

js-bemhtml tech from realty project

var BEM = require('bem'),
    PATH = require('path'),
    INHERIT = BEM.require('inherit'),
    Q = BEM.require('qq'),
    JS = BEM.require('bem/lib/techs/js').Tech;

exports.Tech = INHERIT(JS, {

    getSuffixes: function() {
        return ['js'];
    },

    getBuildResult: function(prefixes, suffix, outputDir, outputName) {

        var context = this.context,
            opts = context.opts;

        console.log('context.techs', context.createTech('bemhtml') );

        return this.__base(prefixes, suffix, outputDir, outputName).then(function(res) {

            var decl = opts.declaration.then(function(decl) { return { deps: decl.depsByTechs.js.bemhtml } });

            var bemhtmlTech = context.createTech('bemhtml'),
                output = PATH.resolve(opts.outputDir, opts.outputName),
                bemhtmlResults = bemhtmlTech.getBuildResults(
                    bemhtmlTech.getBuildPrefixes(bemhtmlTech.transformBuildDecl(decl), context.getLevels()),
                    PATH.dirname(output) + PATH.dirSep,
                    PATH.basename(output));

            bemhtmlResults.then(function(r) { console.log('bemhtmlResults %j', r) });

            res.unshift('/* BEMHTML */\n');
            return res;
        });

    }

});