| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 | 
							- 'use strict';
 
- const {promisify} = require('util');
 
- const fs = require('fs');
 
- const path = require('path');
 
- const fastGlob = require('fast-glob');
 
- const gitIgnore = require('ignore');
 
- const slash = require('slash');
 
- const DEFAULT_IGNORE = [
 
- 	'**/node_modules/**',
 
- 	'**/flow-typed/**',
 
- 	'**/coverage/**',
 
- 	'**/.git'
 
- ];
 
- const readFileP = promisify(fs.readFile);
 
- const mapGitIgnorePatternTo = base => ignore => {
 
- 	if (ignore.startsWith('!')) {
 
- 		return '!' + path.posix.join(base, ignore.slice(1));
 
- 	}
 
- 	return path.posix.join(base, ignore);
 
- };
 
- const parseGitIgnore = (content, options) => {
 
- 	const base = slash(path.relative(options.cwd, path.dirname(options.fileName)));
 
- 	return content
 
- 		.split(/\r?\n/)
 
- 		.filter(Boolean)
 
- 		.filter(line => !line.startsWith('#'))
 
- 		.map(mapGitIgnorePatternTo(base));
 
- };
 
- const reduceIgnore = files => {
 
- 	const ignores = gitIgnore();
 
- 	for (const file of files) {
 
- 		ignores.add(parseGitIgnore(file.content, {
 
- 			cwd: file.cwd,
 
- 			fileName: file.filePath
 
- 		}));
 
- 	}
 
- 	return ignores;
 
- };
 
- const ensureAbsolutePathForCwd = (cwd, p) => {
 
- 	cwd = slash(cwd);
 
- 	if (path.isAbsolute(p)) {
 
- 		if (slash(p).startsWith(cwd)) {
 
- 			return p;
 
- 		}
 
- 		throw new Error(`Path ${p} is not in cwd ${cwd}`);
 
- 	}
 
- 	return path.join(cwd, p);
 
- };
 
- const getIsIgnoredPredecate = (ignores, cwd) => {
 
- 	return p => ignores.ignores(slash(path.relative(cwd, ensureAbsolutePathForCwd(cwd, p.path || p))));
 
- };
 
- const getFile = async (file, cwd) => {
 
- 	const filePath = path.join(cwd, file);
 
- 	const content = await readFileP(filePath, 'utf8');
 
- 	return {
 
- 		cwd,
 
- 		filePath,
 
- 		content
 
- 	};
 
- };
 
- const getFileSync = (file, cwd) => {
 
- 	const filePath = path.join(cwd, file);
 
- 	const content = fs.readFileSync(filePath, 'utf8');
 
- 	return {
 
- 		cwd,
 
- 		filePath,
 
- 		content
 
- 	};
 
- };
 
- const normalizeOptions = ({
 
- 	ignore = [],
 
- 	cwd = slash(process.cwd())
 
- } = {}) => {
 
- 	return {ignore, cwd};
 
- };
 
- module.exports = async options => {
 
- 	options = normalizeOptions(options);
 
- 	const paths = await fastGlob('**/.gitignore', {
 
- 		ignore: DEFAULT_IGNORE.concat(options.ignore),
 
- 		cwd: options.cwd
 
- 	});
 
- 	const files = await Promise.all(paths.map(file => getFile(file, options.cwd)));
 
- 	const ignores = reduceIgnore(files);
 
- 	return getIsIgnoredPredecate(ignores, options.cwd);
 
- };
 
- module.exports.sync = options => {
 
- 	options = normalizeOptions(options);
 
- 	const paths = fastGlob.sync('**/.gitignore', {
 
- 		ignore: DEFAULT_IGNORE.concat(options.ignore),
 
- 		cwd: options.cwd
 
- 	});
 
- 	const files = paths.map(file => getFileSync(file, options.cwd));
 
- 	const ignores = reduceIgnore(files);
 
- 	return getIsIgnoredPredecate(ignores, options.cwd);
 
- };
 
 
  |