diff --git a/README.md b/README.md index 2349e44..ee3d0a2 100644 --- a/README.md +++ b/README.md @@ -12,15 +12,14 @@ This library uses only two subdependencies, unlike globby's [24](https://npmgrap ## Usage ```js -import { glob } from 'tinyglobby'; +import { glob, globSync } from 'tinyglobby'; -await glob({ patterns: ['src/*.ts', '!**/*.d.ts'] }); -``` - -```js -import { globSync } from 'tinyglobby'; +await glob(['files/*.ts', '!**/*.d.ts'], { cwd: 'src' }); +globSync(['src/**/*.ts'], { ignore: ['**/*.d.ts'] }); -globSync({ patterns: ['src/*.ts', '!**/*.d.ts'] }); +// you can also specify patterns inside the options object (exclusive to tinyglobby) +await glob({ patterns: ['src/*.ts', '!**/*.d.ts'], dot: true }); +globSync({ patterns: ['src/**/*.ts', '!**/*.d.ts'], deep: 3 }); ``` ## Options diff --git a/src/index.ts b/src/index.ts index 524c8b8..4770baf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -82,12 +82,28 @@ function getFdirBuilder(options: GlobOptions, cwd: string) { return new fdir(fdirOptions); } -export async function glob(options: GlobOptions | undefined = {}): Promise { - const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd(); - return getFdirBuilder(options, cwd).crawl(cwd).withPromise(); +export function glob(patterns: string[], options?: Omit): Promise; +export function glob(options: GlobOptions): Promise; +export async function glob(patternsOrOptions: string[] | GlobOptions, options?: GlobOptions): Promise { + if (patternsOrOptions && options?.patterns) { + throw new Error('Cannot pass patterns as both an argument and an option'); + } + + const opts = Array.isArray(patternsOrOptions) ? { ...options, patterns: patternsOrOptions } : patternsOrOptions; + const cwd = opts.cwd ? path.resolve(opts.cwd) : process.cwd(); + + return getFdirBuilder(opts, cwd).crawl(cwd).withPromise(); } -export function globSync(options: GlobOptions | undefined = {}): string[] { - const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd(); - return getFdirBuilder(options, cwd).crawl(cwd).sync(); +export function globSync(patterns: string[], options?: Omit): string[]; +export function globSync(options: GlobOptions): string[]; +export function globSync(patternsOrOptions: string[] | GlobOptions, options?: GlobOptions): string[] { + if (patternsOrOptions && options?.patterns) { + throw new Error('Cannot pass patterns as both an argument and an option'); + } + + const opts = Array.isArray(patternsOrOptions) ? { ...options, patterns: patternsOrOptions } : patternsOrOptions; + const cwd = opts.cwd ? path.resolve(opts.cwd) : process.cwd(); + + return getFdirBuilder(opts, cwd).crawl(cwd).sync(); } diff --git a/test/index.test.ts b/test/index.test.ts index 09c1594..e5299b3 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -15,6 +15,16 @@ test('no directory expansion if expandDirectories is set to false', async () => assert.deepEqual(files.sort(), []); }); +test('classic patterns as first argument', async () => { + const files = await glob(['a/*.ts'], { cwd }); + assert.deepEqual(files.sort(), [path.join('a', 'a.ts'), path.join('a', 'b.ts')]); +}); + +test("cant have both classic patterns and options' patterns", async () => { + // @ts-expect-error + assert.rejects(glob(['a/*.ts'], { patterns: ['whoops!'], cwd })); +}); + test('negative patterns', async () => { const files = await glob({ patterns: ['**/a.ts', '!b/a.ts'], cwd }); assert.deepEqual(files.sort(), [path.join('a', 'a.ts')]);