Helper functions for pattern analysis, task generation, and integration with other globbing tools. These utilities provide introspection and compatibility features.
Functions for analyzing glob patterns to determine their characteristics.
/**
* Check if patterns contain special glob characters
* @param patterns - Glob patterns to analyze
* @param options - Fast-glob options that affect pattern analysis
* @returns Boolean indicating presence of dynamic patterns
*/
function isDynamicPattern(
patterns: string | readonly string[],
options?: {
/** Current working directory */
readonly cwd?: URL | string;
}
): boolean;Usage Examples:
import { isDynamicPattern } from "globby";
// Static patterns
console.log(isDynamicPattern('file.txt')); // false
console.log(isDynamicPattern('path/to/file.js')); // false
// Dynamic patterns
console.log(isDynamicPattern('*.js')); // true
console.log(isDynamicPattern('**/*.txt')); // true
console.log(isDynamicPattern('src/{js,ts}/**/*')); // true
// Multiple patterns
console.log(isDynamicPattern(['file.txt', '*.js'])); // true (at least one is dynamic)
// With options
console.log(isDynamicPattern('*', {
cwd: '/custom/path',
caseSensitiveMatch: false
})); // trueFunctions for generating task objects compatible with fast-glob and other globbing libraries.
/**
* Generate glob tasks for use with fast-glob (async)
* @param patterns - Glob patterns to process
* @param options - Globby options
* @returns Promise resolving to array of task objects
*/
function generateGlobTasks(
patterns: string | readonly string[],
options?: Options
): Promise<GlobTask[]>;
/**
* Generate glob tasks for use with fast-glob (sync)
* @param patterns - Glob patterns to process
* @param options - Globby options
* @returns Array of task objects
*/
function generateGlobTasksSync(
patterns: string | readonly string[],
options?: Options
): GlobTask[];Usage Examples:
import { generateGlobTasks, generateGlobTasksSync } from "globby";
import fastGlob from "fast-glob";
// Async task generation
const tasks = await generateGlobTasks(['src/**/*.js', '!**/*.test.js'], {
cwd: '/path/to/project',
gitignore: true
});
// Use tasks with fast-glob directly
const results = await Promise.all(
tasks.map(task => fastGlob(task.patterns, task.options))
);
const allFiles = results.flat();
// Sync task generation
const syncTasks = generateGlobTasksSync(['**/*.ts', '!node_modules/**']);
const syncResults = syncTasks.map(task =>
fastGlob.sync(task.patterns, task.options)
);
// Advanced usage with custom processing
const customTasks = await generateGlobTasks(['**/*.{js,ts}'], {
expandDirectories: {
files: ['index.js', 'main.ts'],
extensions: ['jsx', 'tsx']
}
});
customTasks.forEach((task, index) => {
console.log(`Task ${index}:`, task.patterns);
console.log(`Options:`, task.options);
});Utility for converting file paths to glob patterns, re-exported from fast-glob.
/**
* Convert a path to a pattern
* @param source - File path to convert
* @returns Converted glob pattern
*/
function convertPathToPattern(source: string): string;Usage Examples:
import { convertPathToPattern } from "globby";
// Convert paths to patterns
const pattern1 = convertPathToPattern('/absolute/path/to/file.js');
console.log(pattern1); // Normalized pattern
const pattern2 = convertPathToPattern('relative/path/to/dir');
console.log(pattern2); // Normalized pattern
// Useful for dynamic pattern generation
const basePath = '/project/src';
const files = ['utils.js', 'config.js', 'types.ts'];
const patterns = files.map(file =>
convertPathToPattern(`${basePath}/${file}`)
);The task generation functions return objects with the following structure:
interface GlobTask {
/** Processed glob patterns */
readonly patterns: string[];
/** Fast-glob compatible options */
readonly options: Options;
}Tasks are generated by:
expandDirectories optionimport { generateGlobTasks } from "globby";
import customGlob from "some-other-glob-library";
// Generate tasks with globby's processing
const tasks = await generateGlobTasks([
'src/**/*.js',
'!**/*.test.js',
'lib' // This will be expanded to lib/**/*
], {
gitignore: true,
expandDirectories: true
});
// Use tasks with different glob implementation
const results = await Promise.all(
tasks.map(task => customGlob(task.patterns, task.options))
);import { generateGlobTasksSync, isDynamicPattern } from "globby";
function createBuildConfig(patterns, options = {}) {
// Check if we need glob processing
if (!isDynamicPattern(patterns)) {
return { files: patterns }; // Static files, no globbing needed
}
// Generate optimized tasks
const tasks = generateGlobTasksSync(patterns, options);
return {
tasks: tasks.map(task => ({
include: task.patterns,
exclude: task.options.ignore || [],
cwd: task.options.cwd
}))
};
}
// Usage
const buildConfig = createBuildConfig([
'src/**/*.{js,ts}',
'!**/*.test.{js,ts}',
'static'
], {
gitignore: true,
expandDirectories: { extensions: ['jsx', 'tsx'] }
});import { generateGlobTasks, isDynamicPattern } from "globby";
async function optimizedGlob(patterns, options) {
// Skip expensive processing for static patterns
if (!isDynamicPattern(patterns)) {
return Array.isArray(patterns) ? patterns : [patterns];
}
// Use task generation for complex patterns
const tasks = await generateGlobTasks(patterns, options);
// Process tasks in parallel with concurrency limit
const concurrency = 4;
const results = [];
for (let i = 0; i < tasks.length; i += concurrency) {
const batch = tasks.slice(i, i + concurrency);
const batchResults = await Promise.all(
batch.map(task => fastGlob(task.patterns, task.options))
);
results.push(...batchResults.flat());
}
return [...new Set(results)]; // Remove duplicates
}The utility functions handle errors gracefully:
isDynamicPattern: Returns false for invalid patternsgenerateGlobTasks: Throws errors for invalid options or patternsconvertPathToPattern: Handles path normalization errorsimport { isDynamicPattern, generateGlobTasks } from "globby";
// Safe pattern checking
function safeIsDynamic(patterns) {
try {
return isDynamicPattern(patterns);
} catch (error) {
console.warn('Invalid patterns:', error);
return false;
}
}
// Task generation with error handling
async function safeGenerateTasks(patterns, options) {
try {
return await generateGlobTasks(patterns, options);
} catch (error) {
console.error('Task generation failed:', error);
return [{ patterns: [], options: {} }];
}
}