Skip to content

Commit b8959a5

Browse files
authored
fix(fs,path): expandGlob, expandGlobSync, and isGlob match @(alternate) syntax with only one member (#6850)
1 parent 9974071 commit b8959a5

File tree

4 files changed

+12
-5
lines changed

4 files changed

+12
-5
lines changed

fs/expand_glob.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -297,8 +297,8 @@ export async function* expandGlob(
297297
const excludePatterns = exclude
298298
.map(resolveFromRoot)
299299
.map((s: string): RegExp => globToRegExp(s, globOptions));
300-
const shouldInclude = (path: string): boolean =>
301-
!excludePatterns.some((p: RegExp): boolean => !!path.match(p));
300+
const shouldInclude = (path: string) =>
301+
!excludePatterns.some((p) => p.test(path));
302302

303303
let fixedRoot = isGlobAbsolute ? winRoot ?? "/" : absRoot;
304304
while (segments.length > 0 && !isGlob(segments[0]!)) {
@@ -454,8 +454,8 @@ export function* expandGlobSync(
454454
const excludePatterns = exclude
455455
.map(resolveFromRoot)
456456
.map((s: string): RegExp => globToRegExp(s, globOptions));
457-
const shouldInclude = (path: string): boolean =>
458-
!excludePatterns.some((p: RegExp): boolean => !!path.match(p));
457+
const shouldInclude = (path: string) =>
458+
!excludePatterns.some((p) => p.test(path));
459459

460460
let fixedRoot = isGlobAbsolute ? winRoot ?? "/" : absRoot;
461461
while (segments.length > 0 && !isGlob(segments[0]!)) {

fs/expand_glob_test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,9 @@ Deno.test("expandGlob() accepts extended option set as true", async function ()
197197
"abcdef",
198198
"abcdefghi",
199199
]);
200+
assertEquals(await expandGlobArray("abc@(def)", options), ["abcdef"]);
200201
assertEquals(await expandGlobArray("abc@(def|ghi)", options), ["abcdef"]);
202+
assertEquals(await expandGlobArray("abc{def}", options), ["abcdef"]);
201203
assertEquals(await expandGlobArray("abc{def,ghi}", options), ["abcdef"]);
202204
assertEquals(await expandGlobArray("abc!(def|ghi)", options), ["abc"]);
203205
});
@@ -217,7 +219,9 @@ Deno.test("expandGlobSync() accepts extended option set as true", function () {
217219
"abcdef",
218220
"abcdefghi",
219221
]);
222+
assertEquals(expandGlobSyncArray("abc@(def)", options), ["abcdef"]);
220223
assertEquals(expandGlobSyncArray("abc@(def|ghi)", options), ["abcdef"]);
224+
assertEquals(expandGlobSyncArray("abc{def}", options), ["abcdef"]);
221225
assertEquals(expandGlobSyncArray("abc{def,ghi}", options), ["abcdef"]);
222226
assertEquals(expandGlobSyncArray("abc!(def|ghi)", options), ["abc"]);
223227
});

path/is_glob.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
export function isGlob(str: string): boolean {
2020
const chars: Record<string, string> = { "{": "}", "(": ")", "[": "]" };
2121
const regex =
22-
/\\(.)|(^!|\*|\?|[\].+)]\?|\[[^[\\\]]+\]|\{[^{\\}]+\}|\(\?[:!=][^\\)]+\)|\([^(|]+\|[^\\)]+\))/;
22+
/\\(.)|(^!|\*|\?|[\].+)]\?|\[[^[\\\]]+\]|\{[^{\\}]+\}|\(\?[:!=][^\\)]+\)|\([^(|]+\|[^\\)]+\)|@\([^)]+\))/;
2323

2424
if (str === "") {
2525
return false;

path/is_glob_test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,10 @@ Deno.test({
9191
assert(isGlob("a/b/c/[a-z].js"));
9292
assert(isGlob("abc/(aaa|bbb).js"));
9393
assert(isGlob("abc/*.js"));
94+
assert(isGlob("abc/{a}.js"));
9495
assert(isGlob("abc/{a,b}.js"));
96+
assert(isGlob("abc/@(a).js"));
97+
assert(isGlob("abc/@(a|b).js"));
9598
assert(isGlob("abc/{a..z..2}.js"));
9699
assert(isGlob("abc/{a..z}.js"));
97100

0 commit comments

Comments
 (0)