diff --git a/src/index.ts b/src/index.ts index eb6920c5..e3f412d5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,13 +7,15 @@ import { ReaderAsync, ReaderStream, ReaderSync } from './readers'; import type { Options as OptionsInternal } from './settings'; import type { Entry as EntryInternal, EntryItem, FileSystemAdapter as FileSystemAdapterInternal, Pattern as PatternInternal } from './types'; +type InputPattern = PatternInternal | readonly PatternInternal[]; + type EntryObjectModePredicate = { [TKey in keyof Pick]-?: true }; type EntryStatsPredicate = { [TKey in keyof Pick]-?: true }; type EntryObjectPredicate = EntryObjectModePredicate | EntryStatsPredicate; -function FastGlob(source: PatternInternal | PatternInternal[], options: EntryObjectPredicate & OptionsInternal): Promise; -function FastGlob(source: PatternInternal | PatternInternal[], options?: OptionsInternal): Promise; -async function FastGlob(source: PatternInternal | PatternInternal[], options?: OptionsInternal): Promise { +function FastGlob(source: InputPattern, options: EntryObjectPredicate & OptionsInternal): Promise; +function FastGlob(source: InputPattern, options?: OptionsInternal): Promise; +async function FastGlob(source: InputPattern, options?: OptionsInternal): Promise { assertPatternsInput(source); const settings = new Settings(options); @@ -41,9 +43,9 @@ namespace FastGlob { export const async = FastGlob; - export function sync(source: PatternInternal | PatternInternal[], options: EntryObjectPredicate & OptionsInternal): EntryInternal[]; - export function sync(source: PatternInternal | PatternInternal[], options?: OptionsInternal): string[]; - export function sync(source: PatternInternal | PatternInternal[], options?: OptionsInternal): EntryItem[] { + export function sync(source: InputPattern, options: EntryObjectPredicate & OptionsInternal): EntryInternal[]; + export function sync(source: InputPattern, options?: OptionsInternal): string[]; + export function sync(source: InputPattern, options?: OptionsInternal): EntryItem[] { assertPatternsInput(source); const settings = new Settings(options); @@ -56,7 +58,7 @@ namespace FastGlob { return utils.array.flatFirstLevel(entries); } - export function stream(source: PatternInternal | PatternInternal[], options?: OptionsInternal): NodeJS.ReadableStream { + export function stream(source: InputPattern, options?: OptionsInternal): NodeJS.ReadableStream { assertPatternsInput(source); const settings = new Settings(options); @@ -74,7 +76,7 @@ namespace FastGlob { return utils.stream.merge(streams); } - export function generateTasks(source: PatternInternal | PatternInternal[], options?: OptionsInternal): Task[] { + export function generateTasks(source: InputPattern, options?: OptionsInternal): Task[] { assertPatternsInput(source); const patterns = ([] as PatternInternal[]).concat(source); @@ -132,7 +134,7 @@ namespace FastGlob { } } -function getTasks(source: PatternInternal | PatternInternal[], settings: Settings): taskManager.Task[] { +function getTasks(source: InputPattern, settings: Settings): taskManager.Task[] { const patterns = ([] as PatternInternal[]).concat(source); return taskManager.generate(patterns, settings); diff --git a/src/managers/tasks.ts b/src/managers/tasks.ts index f0b1a9b9..dab09743 100644 --- a/src/managers/tasks.ts +++ b/src/managers/tasks.ts @@ -11,9 +11,9 @@ export interface Task { negative: Pattern[]; } -export function generate(input: Pattern[], settings: Settings): Task[] { - const patterns = processPatterns(input, settings); - const ignore = processPatterns(settings.ignore, settings); +export function generate(input: readonly Pattern[], settings: Settings): Task[] { + const patterns = processPatterns([...input], settings); + const ignore = processPatterns([...settings.ignore], settings); const positivePatterns = getPositivePatterns(patterns); const negativePatterns = getNegativePatternsAsPositive(patterns, ignore); diff --git a/src/settings.ts b/src/settings.ts index 8900b04e..d16e7757 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -95,7 +95,7 @@ export interface Options { * * @default [] */ - ignore?: Pattern[]; + ignore?: readonly Pattern[]; /** * Mark the directory path with the final slash. * @@ -161,7 +161,7 @@ export default class Settings { public readonly followSymbolicLinks: boolean; public readonly fs: FileSystemAdapter; public readonly globstar: boolean; - public readonly ignore: Pattern[]; + public readonly ignore: readonly Pattern[]; public readonly markDirectories: boolean; public readonly objectMode: boolean; public readonly onlyDirectories: boolean;