Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplify task expansion #215

Merged
merged 3 commits into from Jan 19, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
136 changes: 70 additions & 66 deletions index.js
Expand Up @@ -36,6 +36,21 @@ const checkCwdOption = options => {
}
};

const normalizeOptions = (options = {}) => {
options = {
ignore: [],
expandDirectories: true,
...options,
cwd: toPath(options.cwd),
};

checkCwdOption(options);

return options;
};

const normalizeArguments = fn => (patterns, options) => fn(toPatternsArray(patterns), normalizeOptions(options));

const getFilter = async options => createFilterFunction(
options.gitignore && await isGitIgnored({cwd: options.cwd, ignore: options.ignore}),
);
Expand All @@ -56,17 +71,7 @@ const createFilterFunction = isIgnored => {
const unionFastGlobResults = (results, filter) => results.flat().filter(fastGlobResult => filter(fastGlobResult));
const unionFastGlobStreams = (streams, filter) => merge2(streams).pipe(new FilterStream(fastGlobResult => filter(fastGlobResult)));

export const generateGlobTasks = (patterns, taskOptions = {}) => {
patterns = toPatternsArray(patterns);

taskOptions = {
ignore: [],
expandDirectories: true,
...taskOptions,
cwd: toPath(taskOptions.cwd),
};
checkCwdOption(taskOptions);

const generateGlobTasksInternal = (patterns, taskOptions) => {
const globTasks = [];
for (const [index, pattern] of patterns.entries()) {
if (isNegative(pattern)) {
Expand Down Expand Up @@ -110,86 +115,85 @@ const globDirectories = (task, fn) => {
return fn(task.pattern, options);
};

const getPattern = (task, fn) => task.options.expandDirectories ? globDirectories(task, fn) : [task.pattern];
const generateTasks = async (patterns, options) => {
const globTasks = generateGlobTasksInternal(patterns, options);

const globToTask = task => async glob => {
const {options} = task;
if (options.ignore && Array.isArray(options.ignore) && options.expandDirectories) {
options.ignore = await dirGlob(options.ignore);
if (!options.expandDirectories) {
return globTasks;
}

return {
pattern: glob,
options,
};
};

const globToTaskSync = task => glob => {
const {options} = task;
if (options.ignore && Array.isArray(options.ignore) && options.expandDirectories) {
options.ignore = dirGlob.sync(options.ignore);
}
const tasks = await Promise.all(
globTasks.map(async task => {
const {options} = task;

const [
patterns,
ignore,
] = await Promise.all([
globDirectories(task, dirGlob),
dirGlob(options.ignore),
]);

options.ignore = ignore;
return patterns.map(pattern => ({pattern, options}));
}),
);

return {
pattern: glob,
options,
};
return tasks.flat();
};

export const globby = async (patterns, options = {}) => {
const globTasks = generateGlobTasks(patterns, options);
const generateTasksSync = (patterns, options) => {
const globTasks = generateGlobTasksInternal(patterns, options);

const getTasks = async () => {
const tasks = await Promise.all(globTasks.map(async task => {
const globs = await getPattern(task, dirGlob);
return Promise.all(globs.map(globToTask(task)));
}));
if (!options.expandDirectories) {
return globTasks;
}

return tasks.flat();
};
return globTasks.flatMap(task => {
const {options} = task;
const patterns = globDirectories(task, dirGlob.sync);
options.ignore = dirGlob.sync(options.ignore);
return patterns.map(pattern => ({pattern, options}));
});
};

const [filter, tasks] = await Promise.all([getFilter(options), getTasks()]);
export const globby = async (patterns, options) => {
patterns = toPatternsArray(patterns);
options = normalizeOptions(options);

const [
tasks,
filter,
] = await Promise.all([
generateTasks(patterns, options),
getFilter(options),
]);
const results = await Promise.all(tasks.map(task => fastGlob(task.pattern, task.options)));

return unionFastGlobResults(results, filter);
};

export const globbySync = (patterns, options = {}) => {
const globTasks = generateGlobTasks(patterns, options);

const tasks = globTasks.flatMap(
task => getPattern(task, dirGlob.sync).map(globToTaskSync(task)),
);

export const globbySync = normalizeArguments((patterns, options) => {
const tasks = generateTasksSync(patterns, options);
const filter = getFilterSync(options);
const results = tasks.map(task => fastGlob.sync(task.pattern, task.options));

return unionFastGlobResults(results, filter);
};

export const globbyStream = (patterns, options = {}) => {
const globTasks = generateGlobTasks(patterns, options);

const tasks = globTasks.flatMap(
task => getPattern(task, dirGlob.sync).map(globToTaskSync(task)),
);
});

export const globbyStream = normalizeArguments((patterns, options) => {
const tasks = generateTasksSync(patterns, options);
const filter = getFilterSync(options);
const streams = tasks.map(task => fastGlob.stream(task.pattern, task.options));

return unionFastGlobStreams(streams, filter);
};
});

export const isDynamicPattern = (patterns, options = {}) => {
patterns = toPatternsArray(patterns);
options = {
...options,
cwd: toPath(options.cwd),
};
checkCwdOption(options);
export const isDynamicPattern = normalizeArguments(
(patterns, options) => patterns.some(pattern => fastGlob.isDynamicPattern(pattern, options)),
);

return patterns.some(pattern => fastGlob.isDynamicPattern(pattern, options));
};
export const generateGlobTasks = normalizeArguments(generateGlobTasksInternal);

export {
isGitIgnored,
Expand Down