rollup-pluginutils
Version:
Functionality commonly needed by Rollup plugins
53 lines (42 loc) • 1.4 kB
text/typescript
import mm from 'micromatch';
import { resolve, sep } from 'path';
import { CreateFilter } from './pluginutils';
import ensureArray from './utils/ensureArray';
function getMatcherString(id: string, resolutionBase: string | false | null | undefined) {
if (resolutionBase === false) {
return id;
}
return resolve(...(typeof resolutionBase === 'string' ? [resolutionBase, id] : [id]));
}
const createFilter: CreateFilter = function createFilter(include?, exclude?, options?) {
const resolutionBase = options && options.resolve;
const getMatcher = (id: string | RegExp) => {
return id instanceof RegExp
? id
: {
test: mm.matcher(
getMatcherString(id, resolutionBase)
.split(sep)
.join('/'),
{ dot: true }
)
};
};
const includeMatchers = ensureArray(include).map(getMatcher);
const excludeMatchers = ensureArray(exclude).map(getMatcher);
return function(id: string | any): boolean {
if (typeof id !== 'string') return false;
if (/\0/.test(id)) return false;
id = id.split(sep).join('/');
for (let i = 0; i < excludeMatchers.length; ++i) {
const matcher = excludeMatchers[i];
if (matcher.test(id)) return false;
}
for (let i = 0; i < includeMatchers.length; ++i) {
const matcher = includeMatchers[i];
if (matcher.test(id)) return true;
}
return !includeMatchers.length;
};
};
export { createFilter as default };