<commit_before>/**
 * file-merge
 * ==========
 *
 * Склеивает набор файлов в один.
 *
 * **Опции**
 *
 * * *String[]* **sources** — Список исходных таргетов. Обязательная опция.
 * * *String* **target** — Результирующий таргет. Обязательная опция.
 * * *String* **divider** — Строка для склеивания файлов. По умолчанию — "\n".
 * * *Boolean* **sourcemap** — Построение карт кода (source maps) с информацией об исходных файлах.
 *
 * **Пример**
 *
 * ```javascript
 * nodeConfig.addTech([ require('enb/techs/file-merge'), {
 *     sources: ['?.bemhtml', '?.pre.js']
 *     target: '?.js'
 * } ]);
 * ```
 */
var vow = require('vow'),
    enb = require('../lib/api'),
    vfs = enb.asyncFs,
    File = require('enb-source-map/lib/file');

module.exports = enb.buildFlow.create()
    .name('file-merge')
    .target('target', '?.target')
    .defineOption('divider', '\n')
    .defineRequiredOption('target')
    .defineRequiredOption('sources')
    .defineOption('sourcemap', false)
    .useSourceListFilenames('sources')
    .builder(function (sources) {
        var divider = this._divider;
        var sourcemap = this._sourcemap;
        var target = this._target;

        return vow.all(sources.map(function (sourceFilename) {
            return vfs.read(sourceFilename, 'utf8');
        })).then(function (results) {
            if (!sourcemap) {
                return results.join(divider);
            }

            return joinWithSourceMaps(sources, results, divider, target);
        });
    })
    .createTech();

///
function joinWithSourceMaps(fileNames, contents, divider, target) {
    var targetFile = new File(target, {sourceMap: true, comment: 'block'});

    fileNames.forEach(function (file, i) {
        targetFile.writeFileContent(file, contents[i]);
        targetFile.write(divider);
    });

    return targetFile.render();
}<commit_msg>Fix source maps: Relative paths instead of abs<commit_after>/**
 * file-merge
 * ==========
 *
 * Склеивает набор файлов в один.
 *
 * **Опции**
 *
 * * *String[]* **sources** — Список исходных таргетов. Обязательная опция.
 * * *String* **target** — Результирующий таргет. Обязательная опция.
 * * *String* **divider** — Строка для склеивания файлов. По умолчанию — "\n".
 * * *Boolean* **sourcemap** — Построение карт кода (source maps) с информацией об исходных файлах.
 *
 * **Пример**
 *
 * ```javascript
 * nodeConfig.addTech([ require('enb/techs/file-merge'), {
 *     sources: ['?.bemhtml', '?.pre.js']
 *     target: '?.js'
 * } ]);
 * ```
 */
var vow = require('vow'),
    enb = require('../lib/api'),
    vfs = enb.asyncFs,
    File = require('enb-source-map/lib/file');

module.exports = enb.buildFlow.create()
    .name('file-merge')
    .target('target', '?.target')
    .defineOption('divider', '\n')
    .defineRequiredOption('target')
    .defineRequiredOption('sources')
    .defineOption('sourcemap', false)
    .useSourceListFilenames('sources')
    .builder(function (sources) {
        var divider = this._divider;
        var sourcemap = this._sourcemap;
        var target = this._target;
        var node = this.node;

        return vow.all(sources.map(function (sourceFilename) {
            return vfs.read(sourceFilename, 'utf8');
        })).then(function (results) {
            if (!sourcemap) {
                return results.join(divider);
            }

            var relFileNames = sources.map(node.relativePath, node);

            return joinWithSourceMaps(relFileNames, results, divider, target);
        });
    })
    .createTech();

///
function joinWithSourceMaps(fileNames, contents, divider, target) {
    var targetFile = new File(target, {sourceMap: true, comment: 'block'});

    fileNames.forEach(function (file, i) {
        targetFile.writeFileContent(file, contents[i]);
        targetFile.write(divider);
    });

    return targetFile.render();
}
{'fraction_non_alphanumeric': 0.169425763062597, 'fraction_numerical': 0.0005173305742369374, 'mean_word_length': 2.9661538461538464, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '468884', 'n_tokens_mistral': 1298, 'n_tokens_neox': 1322, 'n_words': 268}