summaryrefslogtreecommitdiff
path: root/node_modules/globby/ignore.js
diff options
context:
space:
mode:
authorPhilipp Tanlak <philipp.tanlak@gmail.com>2025-11-24 20:54:57 +0100
committerPhilipp Tanlak <philipp.tanlak@gmail.com>2025-11-24 20:57:48 +0100
commitb1e2c8fd5cb5dfa46bc440a12eafaf56cd844b1c (patch)
tree49d360fd6cbc6a2754efe93524ac47ff0fbe0f7d /node_modules/globby/ignore.js
Docs
Diffstat (limited to 'node_modules/globby/ignore.js')
-rw-r--r--node_modules/globby/ignore.js94
1 files changed, 94 insertions, 0 deletions
diff --git a/node_modules/globby/ignore.js b/node_modules/globby/ignore.js
new file mode 100644
index 0000000..3d8e1a8
--- /dev/null
+++ b/node_modules/globby/ignore.js
@@ -0,0 +1,94 @@
+import process from 'node:process';
+import fs from 'node:fs';
+import path from 'node:path';
+import fastGlob from 'fast-glob';
+import gitIgnore from 'ignore';
+import slash from 'slash';
+import {toPath, isNegativePattern} from './utilities.js';
+
+const ignoreFilesGlobOptions = {
+ ignore: [
+ '**/node_modules',
+ '**/flow-typed',
+ '**/coverage',
+ '**/.git',
+ ],
+ absolute: true,
+ dot: true,
+};
+
+export const GITIGNORE_FILES_PATTERN = '**/.gitignore';
+
+const applyBaseToPattern = (pattern, base) => isNegativePattern(pattern)
+ ? '!' + path.posix.join(base, pattern.slice(1))
+ : path.posix.join(base, pattern);
+
+const parseIgnoreFile = (file, cwd) => {
+ const base = slash(path.relative(cwd, path.dirname(file.filePath)));
+
+ return file.content
+ .split(/\r?\n/)
+ .filter(line => line && !line.startsWith('#'))
+ .map(pattern => applyBaseToPattern(pattern, base));
+};
+
+const toRelativePath = (fileOrDirectory, cwd) => {
+ cwd = slash(cwd);
+ if (path.isAbsolute(fileOrDirectory)) {
+ if (slash(fileOrDirectory).startsWith(cwd)) {
+ return path.relative(cwd, fileOrDirectory);
+ }
+
+ throw new Error(`Path ${fileOrDirectory} is not in cwd ${cwd}`);
+ }
+
+ return fileOrDirectory;
+};
+
+const getIsIgnoredPredicate = (files, cwd) => {
+ const patterns = files.flatMap(file => parseIgnoreFile(file, cwd));
+ const ignores = gitIgnore().add(patterns);
+
+ return fileOrDirectory => {
+ fileOrDirectory = toPath(fileOrDirectory);
+ fileOrDirectory = toRelativePath(fileOrDirectory, cwd);
+ return fileOrDirectory ? ignores.ignores(slash(fileOrDirectory)) : false;
+ };
+};
+
+const normalizeOptions = (options = {}) => ({
+ cwd: toPath(options.cwd) || process.cwd(),
+ suppressErrors: Boolean(options.suppressErrors),
+ deep: typeof options.deep === 'number' ? options.deep : Number.POSITIVE_INFINITY,
+});
+
+export const isIgnoredByIgnoreFiles = async (patterns, options) => {
+ const {cwd, suppressErrors, deep} = normalizeOptions(options);
+
+ const paths = await fastGlob(patterns, {cwd, suppressErrors, deep, ...ignoreFilesGlobOptions});
+
+ const files = await Promise.all(
+ paths.map(async filePath => ({
+ filePath,
+ content: await fs.promises.readFile(filePath, 'utf8'),
+ })),
+ );
+
+ return getIsIgnoredPredicate(files, cwd);
+};
+
+export const isIgnoredByIgnoreFilesSync = (patterns, options) => {
+ const {cwd, suppressErrors, deep} = normalizeOptions(options);
+
+ const paths = fastGlob.sync(patterns, {cwd, suppressErrors, deep, ...ignoreFilesGlobOptions});
+
+ const files = paths.map(filePath => ({
+ filePath,
+ content: fs.readFileSync(filePath, 'utf8'),
+ }));
+
+ return getIsIgnoredPredicate(files, cwd);
+};
+
+export const isGitIgnored = options => isIgnoredByIgnoreFiles(GITIGNORE_FILES_PATTERN, options);
+export const isGitIgnoredSync = options => isIgnoredByIgnoreFilesSync(GITIGNORE_FILES_PATTERN, options);