UNPKG

direct-dev

Version:
98 lines (79 loc) 2.41 kB
'use strict'; var path = require('path'); var lodash = require('lodash'); var bemNaming = require('bem-naming'); var pathIsInside = require('path-is-inside'); var levelUtils = require('./levels'); var defaultData = { targetBlock: undefined, targetLevels: undefined, techs: undefined }; var defaultOptions = { rootPath: process.cwd() }; var filterFn = function filterFn(getPath, file) { var filePath = getPath(file); var parts = path.basename(filePath).split('.'); if (this.data.techs) { var techs = [].concat(this.data.techs || []); var hash = lodash.keyBy(techs); var tech = parts.slice(1).join('.'); return !!hash[tech]; } if (this.data.targetBlock) { var baseName = parts[0]; var entity = bemNaming.parse(baseName); if (entity.block !== this.data.targetBlock) { return false; } } if (this.data.targetLevels.length) { var checkPath = pathIsInside.bind(this, filePath); if (!this.data.targetLevels.some(checkPath)) { return false; } } return true; }; /** * пример: * * var myFilter = new BlockFilter({ targetBlock: 'b1', targetLevels: [...] }, { rootPath: 'my/path' }); * var filtered = paths.filter(myFilter); * var filtered = enbFiles.filter(myFilter.enb); * var filtered = vinyls.filter(myFilter.vinyl); * * @param data * @param options * @returns {function(this:BlockFilter)} * @constructor */ var BlockFilter = function BlockFilter(data, options) { this.data = lodash.extend({}, defaultData, data); this.opts = lodash.extend({}, defaultOptions, options); // преобразуем список уровней в абсолютные пути this.data.targetLevels = levelUtils.normalizeLevels(this.data.targetLevels, this.opts.rootPath).map(function (level) { return level.path; }); var result = filterFn.bind(this, function (file) { return file; }); result.enb = filterFn.bind(this, function (file) { return file.fullname; }); result.vinyl = filterFn.bind(this, function (file) { return file.path; }); return result; }; BlockFilter.empty = function () { return true; }; BlockFilter.empty.enb = function () { return true; }; BlockFilter.empty.vinyl = function () { return true; }; module.exports = BlockFilter;