Top Related Projects
glob functionality for node.js
Highly optimized wildcard and glob matching library. Faster, drop-in replacement to minimatch and multimatch. Used by square, webpack, babel core, yarn, jest, ract-native, taro, bulma, browser-sync, stylelint, nyc, ava, and many others! Follow micromatch's author: https://github.com/jonschlinkert
:rocket: It's a very fast and efficient glob library for Node.js
Highly configurable logging library
Quick Overview
Globby is a powerful Node.js library that provides fast and flexible file and directory matching using glob patterns. It extends the capabilities of the native glob module with additional features and improved performance, making it easier to work with file systems in Node.js applications.
Pros
- Fast performance due to optimized algorithms and caching
- Supports advanced glob patterns and extended syntax
- Provides both synchronous and asynchronous APIs
- Integrates well with other popular Node.js libraries and frameworks
Cons
- Limited to Node.js environments, not suitable for browser-based applications
- May have a steeper learning curve for users unfamiliar with glob patterns
- Some advanced features might be overkill for simple use cases
Code Examples
- Basic file matching:
import globby from 'globby';
const paths = await globby('*.js');
console.log(paths);
- Multiple patterns and negation:
import globby from 'globby';
const paths = await globby(['**/*.js', '!node_modules/**']);
console.log(paths);
- Using options for more control:
import globby from 'globby';
const paths = await globby('**/*.txt', {
cwd: '/path/to/search',
dot: true,
gitignore: true
});
console.log(paths);
Getting Started
To use Globby in your Node.js project, follow these steps:
-
Install the package:
npm install globby -
Import and use in your JavaScript file:
import globby from 'globby'; (async () => { const paths = await globby('**/*.js'); console.log(paths); })(); -
For CommonJS environments, use require instead:
const globby = require('globby'); (async () => { const paths = await globby('**/*.js'); console.log(paths); })();
Competitor Comparisons
glob functionality for node.js
Pros of node-glob
- More mature and established project with a longer history
- Provides a lower-level API for more fine-grained control
- Supports advanced features like
ignorepatterns andfollowsymlinks
Cons of node-glob
- Less user-friendly for simple use cases
- Requires more manual configuration for common scenarios
- Slower performance compared to globby in some cases
Code Comparison
node-glob:
const glob = require('glob');
glob('**/*.js', (err, files) => {
console.log(files);
});
globby:
const globby = require('globby');
(async () => {
const files = await globby('**/*.js');
console.log(files);
})();
Summary
node-glob is a more established and feature-rich library, offering greater control and advanced options. However, it can be more complex to use and may have slower performance in certain scenarios. globby, on the other hand, provides a more user-friendly API with better performance for common use cases, but may lack some of the advanced features found in node-glob.
Both libraries serve their purposes well, with node-glob being better suited for complex glob operations and fine-grained control, while globby excels in simplicity and ease of use for most common glob pattern matching scenarios.
Highly optimized wildcard and glob matching library. Faster, drop-in replacement to minimatch and multimatch. Used by square, webpack, babel core, yarn, jest, ract-native, taro, bulma, browser-sync, stylelint, nyc, ava, and many others! Follow micromatch's author: https://github.com/jonschlinkert
Pros of micromatch
- More focused on pattern matching, providing a wider range of matching options
- Faster performance for complex glob patterns
- Smaller package size, suitable for projects with limited dependencies
Cons of micromatch
- Less abstraction for file system operations
- Requires more manual configuration for certain use cases
- Limited built-in support for ignoring files (e.g., .gitignore)
Code Comparison
micromatch:
const micromatch = require('micromatch');
const files = ['foo.js', 'bar.txt', 'baz.js'];
const matches = micromatch(files, ['*.js']);
console.log(matches); // ['foo.js', 'baz.js']
globby:
const globby = require('globby');
(async () => {
const paths = await globby(['*.js']);
console.log(paths); // ['foo.js', 'baz.js']
})();
Key Differences
- micromatch focuses on pattern matching, while globby provides higher-level file system operations
- globby offers built-in Promise support and async/await compatibility
- micromatch requires more manual setup for file system operations, but provides finer control over matching
Use Cases
- Choose micromatch for projects requiring advanced pattern matching without file system operations
- Opt for globby when working with file systems and needing a higher-level abstraction
:rocket: It's a very fast and efficient glob library for Node.js
Pros of fast-glob
- Generally faster performance, especially for large file systems
- More flexible and customizable options for glob patterns
- Supports custom file system adapters for non-standard environments
Cons of fast-glob
- Less straightforward API compared to globby
- May require more configuration for simple use cases
- Fewer built-in convenience methods for common scenarios
Code Comparison
fast-glob:
const fg = require('fast-glob');
(async () => {
const entries = await fg(['**/*.js', '!**/node_modules/**'], { dot: true });
console.log(entries);
})();
globby:
const globby = require('globby');
(async () => {
const paths = await globby(['**/*.js', '!**/node_modules/**'], { dot: true });
console.log(paths);
})();
Both libraries provide similar functionality for glob pattern matching, but fast-glob offers more granular control over the matching process at the cost of a slightly more complex API. globby, on the other hand, provides a simpler interface that may be more suitable for straightforward use cases. The choice between the two depends on the specific requirements of your project, such as performance needs, customization options, and ease of use.
Highly configurable logging library
Pros of Signale
- Provides a more comprehensive logging system with customizable loggers and themes
- Offers interactive prompts and spinners for enhanced user interaction
- Supports custom timers for performance tracking
Cons of Signale
- More focused on logging and output formatting, less versatile for file system operations
- May have a steeper learning curve due to its more extensive feature set
- Potentially higher overhead for simple logging tasks
Code Comparison
Globby (file matching):
const globby = require('globby');
(async () => {
const paths = await globby(['**/*.js', '!node_modules']);
console.log(paths);
})();
Signale (logging):
const { Signale } = require('signale');
const options = {
types: {
error: { badge: '!!', color: 'red' },
success: { badge: '✔', color: 'green' }
}
};
const signale = new Signale(options);
signale.success('Operation successful');
signale.error('Operation failed');
While both libraries serve different primary purposes, they can complement each other in a Node.js project. Globby excels at file matching and pattern searching, while Signale provides advanced logging and user interaction capabilities. The choice between them depends on the specific needs of your project, whether it's file system operations or enhanced logging and output formatting.
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
globby
User-friendly glob matching
Based on fast-glob but adds a bunch of useful features.
Features
- Promise API
- Multiple patterns
- Negated patterns:
['foo*', '!foobar'] - Negation-only patterns:
['!foobar']â matches all files exceptfoobar - Expands directories:
fooâfoo/**/* - Supports
.gitignoreand similar ignore config files - Supports
URLascwd
Install
npm install globby
Usage
âââ unicorn
âââ cake
âââ rainbow
import {globby} from 'globby';
const paths = await globby(['*', '!cake']);
console.log(paths);
//=> ['unicorn', 'rainbow']
API
Note that glob patterns can only contain forward-slashes, not backward-slashes, so if you want to construct a glob pattern from path components, you need to use path.posix.join() instead of path.join().
Windows: Patterns with backslashes will silently fail. Use path.posix.join() or convertPathToPattern().
globby(patterns, options?)
Returns a Promise<string[]> of matching paths.
patterns
Type: string | string[]
See supported minimatch patterns.
options
Type: object
See the fast-glob options in addition to the ones below.
expandDirectories
Type: boolean | string[] | object
Default: true
If set to true, globby will automatically glob directories for you. If you define an Array it will only glob files that matches the patterns inside the Array. You can also define an object with files and extensions like below:
import {globby} from 'globby';
const paths = await globby('images', {
expandDirectories: {
files: ['cat', 'unicorn', '*.jpg'],
extensions: ['png']
}
});
console.log(paths);
//=> ['cat.png', 'unicorn.png', 'cow.jpg', 'rainbow.jpg']
Note that if you set this option to false, you won't get back matched directories unless you set onlyFiles: false.
gitignore
Type: boolean
Default: false
Respect ignore patterns in .gitignore files that apply to the globbed files.
When enabled, globby searches for .gitignore files from the current working directory downward, and if a Git repository is detected (by finding a .git directory), it also respects .gitignore files in parent directories up to the repository root. This matches Git's actual behavior where patterns from parent .gitignore files apply to subdirectories.
Gitignore patterns take priority over user patterns, matching Git's behavior. To include gitignored files, set this to false.
Performance: Globby reads .gitignore files before globbing. When there are no negation patterns (like !important.log) and no parent .gitignore files are found, it passes ignore patterns to fast-glob to skip traversing ignored directories entirely, which significantly improves performance for large node_modules or build directories. When negation patterns or parent .gitignore files are present, all filtering is done after traversal to ensure correct Git-compatible behavior. For optimal performance, prefer specific .gitignore patterns without negations, or use ignoreFiles: '.gitignore' to target only the root ignore file.
ignoreFiles
Type: string | string[]
Default: undefined
Glob patterns to look for ignore files, which are then used to ignore globbed files.
This is a more generic form of the gitignore option, allowing you to find ignore files with a compatible syntax. For instance, this works with Babel's .babelignore, Prettier's .prettierignore, or ESLint's .eslintignore files.
Performance tip: Using a specific path like '.gitignore' is much faster than recursive patterns.
expandNegationOnlyPatterns
Type: boolean
Default: true
When only negation patterns are provided (e.g., ['!*.json']), automatically prepend a catch-all pattern (**/*) to match all files before applying negations.
Set to false to return an empty array when only negation patterns are provided. This can be useful when patterns are user-controlled, to avoid unexpectedly matching all files.
import {globby} from 'globby';
// Default behavior: matches all files except .json
await globby(['!*.json']);
//=> ['file.txt', 'image.png', ...]
// Disable expansion: returns empty array
await globby(['!*.json'], {expandNegationOnlyPatterns: false});
//=> []
fs
Type: FileSystemAdapter
Default: undefined
Custom file system implementation (useful for testing or virtual file systems).
Note: When using gitignore or ignoreFiles, the custom fs must also provide readFile/readFileSync methods.
globbySync(patterns, options?)
Returns string[] of matching paths.
globbyStream(patterns, options?)
Returns a stream.Readable of matching paths.
For example, loop over glob matches in a for await...of loop like this:
import {globbyStream} from 'globby';
for await (const path of globbyStream('*.tmp')) {
console.log(path);
}
convertPathToPattern(path)
Converts a path to a pattern by escaping special glob characters like (), [], {}. On Windows, also converts backslashes to forward slashes.
Use this when your literal paths contain characters with special meaning in globs.
import {globby, convertPathToPattern} from 'globby';
// â Fails - parentheses are glob syntax
await globby('C:/Program Files (x86)/*.txt');
//=> []
// â
Works
const base = convertPathToPattern('C:/Program Files (x86)');
await globby(`${base}/*.txt`);
//=> ['C:/Program Files (x86)/file.txt']
generateGlobTasks(patterns, options?)
Returns an Promise<object[]> in the format {patterns: string[], options: Object}, which can be passed as arguments to fast-glob. This is useful for other globbing-related packages.
Note that you should avoid running the same tasks multiple times as they contain a file system cache. Instead, run this method each time to ensure file system changes are taken into consideration.
generateGlobTasksSync(patterns, options?)
Returns an object[] in the format {patterns: string[], options: Object}, which can be passed as arguments to fast-glob. This is useful for other globbing-related packages.
Takes the same arguments as generateGlobTasks.
isDynamicPattern(patterns, options?)
Returns a boolean of whether there are any special glob characters in the patterns.
Note that the options affect the results.
This function is backed by fast-glob.
isGitIgnored(options?)
Returns a Promise<(path: URL | string) => boolean> indicating whether a given path is ignored via a .gitignore file.
options
Type: object
cwd
Type: URL | string
Default: process.cwd()
The current working directory in which to search.
suppressErrors
Type: boolean
Default: false
Suppress errors when encountering directories or files without read permissions.
deep
Type: number
Default: Infinity
Maximum depth to search for .gitignore files.
0- Only search in the start directory1- Search in the start directory and one level of subdirectories2- Search in the start directory and two levels of subdirectories
ignore
Type: string | string[]
Default: []
Glob patterns to exclude from .gitignore file search.
followSymbolicLinks
Type: boolean
Default: true
Indicates whether to traverse descendants of symbolic link directories.
concurrency
Type: number
Default: os.cpus().length
Specifies the maximum number of concurrent requests from a reader to read directories.
throwErrorOnBrokenSymbolicLink
Type: boolean
Default: false
Throw an error when symbolic link is broken if true or safely return lstat call if false.
fs
Type: FileSystemAdapter
Default: undefined
Custom file system implementation (useful for testing or virtual file systems).
Note: The custom fs must provide readFile/readFileSync methods for reading .gitignore files.
import {isGitIgnored} from 'globby';
const isIgnored = await isGitIgnored();
console.log(isIgnored('some/file'));
// Suppress errors when encountering unreadable directories
const isIgnored = await isGitIgnored({suppressErrors: true});
// Limit search depth and exclude certain directories
const isIgnored = await isGitIgnored({
deep: 2,
ignore: ['**/node_modules/**', '**/dist/**']
});
isGitIgnoredSync(options?)
Returns a (path: URL | string) => boolean indicating whether a given path is ignored via a .gitignore file.
See isGitIgnored for options.
isIgnoredByIgnoreFiles(patterns, options?)
Returns a Promise<(path: URL | string) => boolean> indicating whether a given path is ignored via the ignore files.
This is a more generic form of the isGitIgnored function, allowing you to find ignore files with a compatible syntax. For instance, this works with Babel's .babelignore, Prettier's .prettierignore, or ESLint's .eslintignore files.
patterns
Type: string | string[]
Glob patterns to look for ignore files.
options
Type: object
See isGitIgnored options for all available options.
import {isIgnoredByIgnoreFiles} from 'globby';
const isIgnored = await isIgnoredByIgnoreFiles("**/.gitignore");
console.log(isIgnored('some/file'));
// Suppress errors when encountering unreadable directories
const isIgnored = await isIgnoredByIgnoreFiles("**/.eslintignore", {suppressErrors: true});
// Limit search depth and concurrency
const isIgnored = await isIgnoredByIgnoreFiles("**/.prettierignore", {
deep: 3,
concurrency: 4
});
isIgnoredByIgnoreFilesSync(patterns, options?)
Returns a (path: URL | string) => boolean indicating whether a given path is ignored via the ignore files.
This is a more generic form of the isGitIgnoredSync function, allowing you to find ignore files with a compatible syntax. For instance, this works with Babel's .babelignore, Prettier's .prettierignore, or ESLint's .eslintignore files.
See isIgnoredByIgnoreFiles for patterns and options.
import {isIgnoredByIgnoreFilesSync} from 'globby';
const isIgnored = isIgnoredByIgnoreFilesSync("**/.gitignore");
console.log(isIgnored('some/file'));
Globbing patterns
Just a quick overview.
*matches any number of characters, but not/?matches a single character, but not/**matches any number of characters, including/, as long as it's the only thing in a path part{}allows for a comma-separated list of "or" expressions!at the beginning of a pattern will negate the match
Negation patterns
Globby supports negation patterns to exclude files. There are two ways to use them:
With positive patterns:
await globby(['src/**/*.js', '!src/**/*.test.js']);
// Matches all .js files except test files
Negation-only patterns:
await globby(['!*.json', '!*.xml'], {cwd: 'config'});
// Matches all files in config/ except .json and .xml files
When using only negation patterns, globby implicitly prepends **/* to match all files, then applies the negations. This means ['!*.json', '!*.xml'] is equivalent to ['**/*', '!*.json', '!*.xml'].
Note: The prepended **/* pattern respects the dot option. By default, dotfiles (files starting with .) are not matched unless you set dot: true.
Various patterns and expected matches.
Related
- multimatch - Match against a list instead of the filesystem
- matcher - Simple wildcard matching
- del - Delete files and directories
- make-dir - Make a directory and its parents if needed
Top Related Projects
glob functionality for node.js
Highly optimized wildcard and glob matching library. Faster, drop-in replacement to minimatch and multimatch. Used by square, webpack, babel core, yarn, jest, ract-native, taro, bulma, browser-sync, stylelint, nyc, ava, and many others! Follow micromatch's author: https://github.com/jonschlinkert
:rocket: It's a very fast and efficient glob library for Node.js
Highly configurable logging library
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot