Beispiel #1
0
            .then(function (levels) {
                bundle.provideTechData('?.levels', levels);
                bundle.provideTechData('?.bemdecl.js', bemdecl);

                return bundle.runTechAndGetResults(filesTech, {
                    depsFile: '?.bemdecl.js'
                });
            })
function assert(keysets, expected, opts) {
    opts || (opts = {});

    var scheme = {
        blocks: keysets,
        bundle: {}
    };

    mock(scheme);

    var dirnames = Object.keys(keysets).filter(function (basename) {
            return path.extname(basename) === '.i18n';
        }),
        filenames = Object.keys(keysets).filter(function (basename) {
            return path.extname(basename) === '.js';
        }),
        bundle = new MockNode('bundle'),
        fileList = new FileList(),
        dirList = new FileList(),
        root = 'blocks',
        files = filenames.map(function (basename) {
            var filename = path.resolve(root, basename);

            return FileList.getFileInfo(filename);
        }),
        dirs = dirnames.map(function (basename) {
            var dirname = path.resolve(root, basename),
                info = FileList.getFileInfo(dirname);

            info.files = fs.readdirSync(dirname).map(function (basename) {
                var filename = path.join(dirname, basename);

                return FileList.getFileInfo(filename);
            });

            return info;
        });

    dirList.addFiles(dirs);
    fileList.addFiles(files);

    bundle.provideTechData('?.files', fileList);
    bundle.provideTechData('?.dirs', dirList);

    return bundle.runTechAndRequire(Tech, { lang: opts.lang })
        .spread(function (res) {
            if (inspect(expected).indexOf('[Function]') === -1) {
                // Если ожидается JSON-объект, то сравниваем как объекты
                res.must.eql(expected);
            } else {
                // Если ожидается JavaScript, то сравниваем как строки
                serialize(res).must.eql(serialize(expected));
            }
        });
}
        it('must correctly resolve path', function () {
            var template = [
                        'bh.match("block", function(ctx) {',
                            'var someModule = require("./someModule");',
                            'ctx.content(someModule());',
                        '});'
                    ].join(EOL),
                scheme = {
                    blocks: {
                        'block.bh.js': bhWrap(template),
                        'someModule.js': 'module.exports = function () { return "^_^" };'
                    },
                    bundle: {}
                },
                bundle, fileList;

            scheme[bhCoreFilename] = fs.readFileSync(bhCoreFilename, 'utf-8');

            mock(scheme);

            bundle = new TestNode('bundle');
            fileList = new FileList();
            fileList.addFiles(loadDirSync('blocks'));
            bundle.provideTechData('?.files', fileList);

            return bundle.runTechAndRequire(Tech)
                .spread(function (BH) {
                    BH.apply({ block: 'block' }).must.be('<div class="block">^_^</div>');
                });
        });
function build (scheme, options) {
    var baseScheme = {
            blocks: {},
            bundle: {},
            // jscs:disable
            node_modules: {
                stylus: stylus,
                nib: nib,
                autoprefixer: autoprefixer,
                csswring: csswring,
                postcss: postcss
            }
            // jscs:enable
        },
        commonScheme = deepExtend(baseScheme, scheme),
        commonOptions = deepExtend({ comments: false }, options);

    mockFs(commonScheme);

    var bundle = new MockNode('bundle'),
        fileList = new FileList();

    fileList.addFiles(loadDirSync('blocks'));
    bundle.provideTechData('?.files', fileList);

    return bundle.runTechAndGetContent(StylusTech, commonOptions).spread(function (content) {
        return (commonOptions.compress || commonOptions.comments) ? content : normalizeContent(content);
    });
}
function runTest(testContent, options, template, lib) {
    var bundle,
        fileList,

        scheme = {
            blocks: {
                'base.bemhtml': fs.readFileSync(bemhtmlCoreFilename, 'utf-8'),
                'bla.bemhtml': template || 'block("bla").tag()("a")'
            },
            bundle: {},
            'index.html': fs.readFileSync(htmlFilename, 'utf-8'),
            'test.js': testContent,
            'mocha.js': fs.readFileSync(mochaFilename, 'utf-8'),
            'chai.js': fs.readFileSync(chaiFilename, 'utf-8'),
            'ym.js': fs.readFileSync(ymFilename, 'utf-8'),
            'some-ym-lib.js': lib || ''
        };

    mock(scheme);

    bundle = new MockNode('bundle');
    fileList = new FileList();
    fileList.loadFromDirSync('blocks');
    bundle.provideTechData('?.files', fileList);

    return bundle.runTech(Tech, options)
        .then(function () {
            return runServer(3000);
        });
}
                .then(function () {
                    fileList = new FileList();
                    fileList.addFiles(loadDirSync('blocks'));
                    bundle.provideTechData('?.files', fileList);

                    return bundle.runTechAndRequire(Tech);
                })
        it('must ignore outdated cache', function () {
            var time = new Date(1);

            mock({
                blocks: {
                    'block.i18n.js': mock.file({
                        content: serialize({ scope: { key: 'val' } }),
                        mtime: time
                    })
                },
                bundle: {}
            });

            var bundle = new MockNode('bundle'),
                cache = bundle.getNodeCache('bundle.keysets.lang.js'),
                dirname = path.resolve('blocks'),
                basename = 'block.i18n.js',
                relPath = path.join('blocks', basename),
                cacheKey = 'keysets-file-' + relPath,
                filename = path.resolve(relPath),
                fileList = new FileList(),
                dirList = new FileList();

            fileList.addFiles(loadDirSync(dirname));

            bundle.provideTechData('?.files', fileList);
            bundle.provideTechData('?.dirs', dirList);

            clearRequire(filename);
            require(filename);
            cache.cacheFileInfo(cacheKey, filename);

            mock({
                blocks: {
                    'block.i18n.js': mock.file({
                        content: serialize({ scope: { key: 'val2' } }),
                        mtime: new Date(2)
                    })
                },
                bundle: {}
            });

            return bundle.runTechAndRequire(Tech, { lang: 'lang' })
                .spread(function (res) {
                    res.must.eql({ scope: { key: 'val2' } });
                });
        });
Beispiel #8
0
    it('must support deps as array', function () {
        mockFs({
            bundle: {}
        });

        var bundle = new TestNode('bundle');

        bundle.provideTechData('bundle-1.deps.js', [{ block: 'block-1' }]);
        bundle.provideTechData('bundle-2.deps.js', [{ block: 'block-2' }]);

        return bundle.runTech(Tech, { sources: ['bundle-1.deps.js', 'bundle-2.deps.js'] })
            .then(function (target) {
                target.deps.must.eql([
                    { block: 'block-1' },
                    { block: 'block-2' }
                ]);
            });
    });
        it('must get keysets from cache', function () {
            var time = new Date(1);

            mock({
                blocks: {
                    'block.i18n.js': mock.file({
                        content: serialize({ scope: { key: 'val' } }),
                        mtime: time
                    })
                },
                bundle: {}
            });

            var bundle = new MockNode('bundle'),
                dirname = path.resolve('blocks'),
                fileList = new FileList(),
                dirList = new FileList();

            fileList.addFiles(loadDirSync(dirname));

            bundle.provideTechData('?.files', fileList);
            bundle.provideTechData('?.dirs', dirList);

            return bundle.runTechAndRequire(Tech, { lang: 'lang' })
                .spread(function () {
                    mock({
                        blocks: {
                            'block.i18n.js': mock.file({
                                content: serialize({ scope: { key: 'val2' } }),
                                mtime: time
                            })
                        },
                        bundle: {}
                    });
                    return bundle.runTechAndRequire(Tech, { lang: 'lang' });
                })
                .spread(function (res) {
                    res.must.eql({ scope: { key: 'val' } });
                });
        });
    function build(scheme) {
        var bundle = new MockNode('bundle'),
            fileList = new FileList();

        Object.keys(scheme).forEach(function (item) {
            fs.writeFileSync(path.join(FOLDER.blocks, item), scheme[item], { encoding: 'utf-8' });
        });

        fileList.addFiles(loadDirSync('blocks'));
        bundle.provideTechData('?.files', fileList);

        return bundle.runTechAndGetContent(Tech);
    }
Beispiel #11
0
function build(templates, options, lib) {
    options || (options = {});
    lib || (lib = '');

    var scheme = {
            blocks: {
                'base.bemhtml': files['i-bem.bemhtml'].contents
            },
            bundle: {},
            // jscs:disable
            node_modules: {
                browserify: {
                    'index.js': ''
                },
                fake: {
                    'index.js': 'module.exports = { getText: function () { return "^_^"; } };'
                },
                depend: {
                    'index.js': 'module.exports = "CommonJS";'
                }
            }
            // jscs:enable
        },
        bundle, fileList;

    templates && templates.forEach(function (item, i) {
        scheme.blocks['block-' + i + '.bemhtml'] = item;
    });

    mock(scheme);

    bundle = new MockNode('bundle');
    fileList = new FileList();
    fileList.addFiles(loadDirSync('blocks'));
    bundle.provideTechData('?.files', fileList);

    return bundle.runTech(Tech, options)
        .spread(function () {
            var filename = bundle.resolvePath(bundle.unmaskTargetName(options.target || '?.bemhtml.js')),
                contents = [
                    lib,
                    fs.readFileSync(filename, 'utf-8')
                ].join(EOL);

            fs.writeFileSync(filename, contents);
            clearRequire(filename);
            return require(filename);
        });
}
function runTest(testContent, options, template, lib) {
    var bhTemplate = bhWrap(template || 'bh.match("block", function(ctx) { ctx.tag("a"); });'),
        bundle,
        fileList,

        scheme = {
            blocks: {
                'block.bh.js': bhTemplate
            },
            bundle: {},
            // jscs:disable
            node_modules: {
                fake: {
                    'index.js': 'module.exports = { getText: function () { return "^_^"; } };'
                },
                depend: {
                    'index.js': 'module.exports = "CommonJS";'
                }
            },
            // jscs:enable
            'index.html': fs.readFileSync(htmlFilename, 'utf-8'),
            'test.js': testContent,
            'mocha.js': fs.readFileSync(mochaFilename, 'utf-8'),
            'chai.js': fs.readFileSync(chaiFilename, 'utf-8')
        };

    if (options && options.bhFile) {
        scheme['bh.js'] = options.bhFile;
        options.bhFile = 'bh.js';
    }

    scheme[bhCoreFilename] = fs.readFileSync(bhCoreFilename, 'utf-8');
    scheme['some-lib.js'] = lib || '';

    mock(scheme);

    bundle = new TestNode('bundle');
    fileList = new FileList();
    fileList.addFiles(loadDirSync('blocks'));
    bundle.provideTechData('?.files', fileList);

    return bundle.runTech(Tech, options)
        .then(function () {
            return runServer(3000);
        });
}
Beispiel #13
0
function build(templates, options) {
    templates || (templates = []);
    options || (options = {});

    var scheme = {
            blocks: {},
            bundle: {}
        },
        bundle, fileList;

    // hack for mock-fs
    scheme[bundlePath] = '';

    if (Array.isArray(templates)) {
        if (templates.length) {
            templates.forEach(function (item, i) {
                scheme.blocks['block-' + i + '.bemtree.js'] = item;
            });
        }
    } else {
        scheme.blocks = templates;
    }

    if (templates.length) {
        templates.forEach(function (item, i) {
            scheme.blocks['block-' + i + '.bemtree.js'] = item;
        });
    }

    mock(scheme);

    bundle = new MockNode('bundle');
    fileList = new FileList();
    fileList.addFiles(loadDirSync('blocks'));
    bundle.provideTechData('?.files', fileList);

    return bundle.runTechAndRequire(Tech, options)
        .spread(function (res) {
            var filename = bundle.resolvePath(bundle.unmaskTargetName(options.target || '?.bemtree.js')),
                str = fs.readFileSync(filename, 'utf-8');

            return [res, str];
        });
}
function build(templates, options, lib) {
    var scheme = {
            blocks: {},
            bundle: {},
            // jscs:disable
            node_modules: {
                fake: {
                    'index.js': 'module.exports = { getText: function () { return "^_^"; } };'
                }
            }
            // jscs:enable
        },
        bundle, fileList;

    templates && templates.forEach(function (item, i) {
        scheme.blocks['block-' + i + '.bh.js'] = bhWrap(item);
    });

    scheme[bhCoreFilename] = fs.readFileSync(bhCoreFilename, 'utf-8');

    mock(scheme);

    bundle = new TestNode('bundle');
    fileList = new FileList();
    fileList.addFiles(loadDirSync('blocks'));
    bundle.provideTechData('?.files', fileList);

    return bundle.runTech(Tech, options)
        .spread(function () {
            var filename = path.resolve('bundle', 'bundle.bh.js'),
                contents = [
                    lib,
                    fs.readFileSync(filename, 'utf-8')
                ].join(EOL);

            fs.writeFileSync(filename, contents);

            clearRequire(filename);

            return require(filename);
        });
}
Beispiel #15
0
function runTest(testContent, options, template, lib) {
    var bundle,
        fileList,

        scheme = {
            blocks: {
                'base.bemhtml': fs.readFileSync(bemhtmlCoreFilename, 'utf-8'),
                'bla.bemhtml': template || 'block bla, tag: "a"'
            },
            bundle: {},
            // jscs:disable
            node_modules: {
                browserify: {
                    'index.js': ''
                },
                fake: {
                    'index.js': 'module.exports = { getText: function () { return "Hello world!"; } };'
                },
                depend: {
                    'index.js': 'module.exports = "CommonJS";'
                }
            },
            // jscs:enable
            'index.html': fs.readFileSync(htmlFilename, 'utf-8'),
            'test.js': testContent,
            'mocha.js': fs.readFileSync(mochaFilename, 'utf-8'),
            'chai.js': fs.readFileSync(chaiFilename, 'utf-8'),
            'some-lib.js': lib || ''
        };

    mock(scheme);

    bundle = new MockNode('bundle');
    fileList = new FileList();
    fileList.addFiles(loadDirSync('blocks'));
    bundle.provideTechData('?.files', fileList);

    return bundle.runTech(Tech, options)
        .then(function () {
            return runServer(3000);
        });
}
function prepare(templates, opts) {
    opts || (opts = {});

    var scheme = {
            blocks: {},
            bundle: {},
            'fake-bh.js': mock.file({
                content: [
                    'function BH () {};',
                    'BH.prototype.setOptions = function () {};',
                    'BH.prototype.apply = function () { return "^_^"; };',
                    'module.exports = BH;'
                ].join(EOL),
                mtime: new Date(opts.replaceBHCore ? 1 : 10)
            })
        },
        bundle, fileList;

    templates && templates.forEach(function (item, i) {
        scheme.blocks['block-' + i + '.bh.js'] = bhWrap(item);
    });

    scheme[bhCoreFilename] = mock.file({
        content: fs.readFileSync(bhCoreFilename, 'utf-8'),
        mtime: new Date(1)
    });

    mock(scheme);

    bundle = new TestNode('bundle');
    fileList = new FileList();
    fileList.addFiles(loadDirSync('blocks'));
    bundle.provideTechData('?.files', fileList);

    return bundle;
}
    it('must generate sourcemap', function () {
        var options = {
                sourcemap: true
            },
            scheme = {
                blocks: {},
                bundle: {}
            },
            bundle, fileList;

        scheme[bhCoreFilename] = fs.readFileSync(bhCoreFilename, 'utf-8');

        mock(scheme);

        bundle = new TestNode('bundle');
        fileList = new FileList();
        fileList.addFiles(loadDirSync('blocks'));
        bundle.provideTechData('?.files', fileList);

        return bundle.runTechAndGetContent(Tech, options)
            .spread(function (BH) {
                BH.toString().must.include('sourceMappingURL');
            });
    });
        it('must ignore outdated cache of the templates', function () {
            var scheme = {
                    blocks: {
                        'block.bh.js': bhWrap('bh.match("block", function(ctx) {ctx.tag("a");});')
                    },
                    bundle: {}
                },
                bundle, fileList;

            scheme[bhCoreFilename] = fs.readFileSync(bhCoreFilename, 'utf-8');

            mock(scheme);

            bundle = new TestNode('bundle');
            fileList = new FileList();
            fileList.addFiles(loadDirSync('blocks'));
            bundle.provideTechData('?.files', fileList);

            return bundle.runTech(Tech)
                .then(function () {
                    return writeFile(
                        'blocks/block.bh.js',
                        bhWrap('bh.match("block", function(ctx) {ctx.tag("b");});')
                    );
                })
                .then(function () {
                    fileList = new FileList();
                    fileList.addFiles(loadDirSync('blocks'));
                    bundle.provideTechData('?.files', fileList);

                    return bundle.runTechAndRequire(Tech);
                })
                .spread(function (BH) {
                    BH.apply({ block: 'block' }).must.be('<b class="block"></b>');
                });
        });
Beispiel #19
0
            .then(function (levels) {
                bundle.provideTechData('?.levels', levels);
                bundle.provideTechData('?.deps.js', deps);

                return bundle.runTechAndGetResults(filesTech);
            })