| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | 'use strict';const fs = require('fs');const path = require('path');const fastGlob = require('fast-glob');const gitIgnore = require('ignore');const pify = require('pify');const slash = require('slash');const DEFAULT_IGNORE = [	'**/node_modules/**',	'**/bower_components/**',	'**/flow-typed/**',	'**/coverage/**',	'**/.git'];const readFileP = pify(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.charAt(0) !== '#')		.map(mapGitIgnorePatternTo(base));};const reduceIgnore = files => {	return files.reduce((ignores, file) => {		ignores.add(parseGitIgnore(file.content, {			cwd: file.cwd,			fileName: file.filePath		}));		return ignores;	}, gitIgnore());};const getIsIgnoredPredecate = (ignores, cwd) => {	return p => ignores.ignores(slash(path.relative(cwd, p)));};const getFile = (file, cwd) => {	const filePath = path.join(cwd, file);	return readFileP(filePath, 'utf8')		.then(content => ({			content,			cwd,			filePath		}));};const getFileSync = (file, cwd) => {	const filePath = path.join(cwd, file);	const content = fs.readFileSync(filePath, 'utf8');	return {		content,		cwd,		filePath	};};const normalizeOptions = (options = {}) => {	const ignore = options.ignore || [];	const cwd = options.cwd || process.cwd();	return {ignore, cwd};};module.exports = options => {	options = normalizeOptions(options);	return fastGlob('**/.gitignore', {		ignore: DEFAULT_IGNORE.concat(options.ignore),		cwd: options.cwd	})		.then(paths => Promise.all(paths.map(file => getFile(file, options.cwd))))		.then(files => reduceIgnore(files))		.then(ignores => 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);};
 |