Skip to content

Commit 94c0692

Browse files
allow passing readonly types (#153)
* feat: allow passing readonly types * address comments * chore: reorder imports * chore: remove unnecessary readonly
1 parent b85c139 commit 94c0692

File tree

2 files changed

+14
-13
lines changed

2 files changed

+14
-13
lines changed

src/index.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
escapePath,
88
getPartialMatcher,
99
isDynamicPattern,
10+
isReadonlyArray,
1011
log,
1112
splitPattern
1213
} from './utils.ts';
@@ -25,13 +26,13 @@ export interface GlobOptions {
2526
expandDirectories?: boolean;
2627
followSymbolicLinks?: boolean;
2728
globstar?: boolean;
28-
ignore?: string | string[];
29+
ignore?: string | readonly string[];
2930
onlyDirectories?: boolean;
3031
onlyFiles?: boolean;
3132
/**
3233
* @deprecated Provide patterns as the first argument instead.
3334
*/
34-
patterns?: string | string[];
35+
patterns?: string | readonly string[];
3536
signal?: AbortSignal;
3637
}
3738

@@ -165,15 +166,12 @@ function formatPaths(paths: string[], relative: (p: string) => string) {
165166
return paths;
166167
}
167168

168-
function getCrawler(patterns?: string | string[], options: Omit<GlobOptions, 'patterns'> = {}) {
169+
function getCrawler(patterns?: string | readonly string[], inputOptions: Omit<GlobOptions, 'patterns'> = {}) {
170+
const options = process.env.TINYGLOBBY_DEBUG ? { ...inputOptions, debug: true } : inputOptions;
169171
const cwd = options.cwd
170172
? path.resolve(options.cwd).replace(BACKSLASHES, '/')
171173
: process.cwd().replace(BACKSLASHES, '/');
172174

173-
if (process.env.TINYGLOBBY_DEBUG) {
174-
options.debug = true;
175-
}
176-
177175
if (options.debug) {
178176
log('globbing with:', { patterns, options, cwd });
179177
}
@@ -285,20 +283,20 @@ function getCrawler(patterns?: string | string[], options: Omit<GlobOptions, 'pa
285283
return [new fdir(fdirOptions).crawl(root), relative] as const;
286284
}
287285

288-
export function glob(patterns: string | string[], options?: Omit<GlobOptions, 'patterns'>): Promise<string[]>;
286+
export function glob(patterns: string | readonly string[], options?: Omit<GlobOptions, 'patterns'>): Promise<string[]>;
289287
/**
290288
* @deprecated Provide patterns as the first argument instead.
291289
*/
292290
export function glob(options: GlobOptions): Promise<string[]>;
293291
export async function glob(
294-
patternsOrOptions: string | string[] | GlobOptions,
292+
patternsOrOptions: string | readonly string[] | GlobOptions,
295293
options?: GlobOptions
296294
): Promise<string[]> {
297295
if (patternsOrOptions && options?.patterns) {
298296
throw new Error('Cannot pass patterns as both an argument and an option');
299297
}
300298

301-
const isModern = Array.isArray(patternsOrOptions) || typeof patternsOrOptions === 'string';
299+
const isModern = isReadonlyArray(patternsOrOptions) || typeof patternsOrOptions === 'string';
302300
const opts = isModern ? options : patternsOrOptions;
303301
const patterns = isModern ? patternsOrOptions : patternsOrOptions.patterns;
304302

@@ -310,17 +308,17 @@ export async function glob(
310308
return formatPaths(await crawler.withPromise(), relative);
311309
}
312310

313-
export function globSync(patterns: string | string[], options?: Omit<GlobOptions, 'patterns'>): string[];
311+
export function globSync(patterns: string | readonly string[], options?: Omit<GlobOptions, 'patterns'>): string[];
314312
/**
315313
* @deprecated Provide patterns as the first argument instead.
316314
*/
317315
export function globSync(options: GlobOptions): string[];
318-
export function globSync(patternsOrOptions: string | string[] | GlobOptions, options?: GlobOptions): string[] {
316+
export function globSync(patternsOrOptions: string | readonly string[] | GlobOptions, options?: GlobOptions): string[] {
319317
if (patternsOrOptions && options?.patterns) {
320318
throw new Error('Cannot pass patterns as both an argument and an option');
321319
}
322320

323-
const isModern = Array.isArray(patternsOrOptions) || typeof patternsOrOptions === 'string';
321+
const isModern = isReadonlyArray(patternsOrOptions) || typeof patternsOrOptions === 'string';
324322
const opts = isModern ? options : patternsOrOptions;
325323
const patterns = isModern ? patternsOrOptions : patternsOrOptions.patterns;
326324

src/utils.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import { posix } from 'node:path';
22
import picomatch, { type PicomatchOptions } from 'picomatch';
33

4+
// The `Array.isArray` type guard doesn't work for readonly arrays.
5+
export const isReadonlyArray: (arg: unknown) => arg is readonly unknown[] = Array.isArray;
6+
47
const isWin = process.platform === 'win32';
58

69
// #region PARTIAL MATCHER

0 commit comments

Comments
 (0)