import { path } from "https://deno.land/x/wmill@v1.354.0/deps.ts";
const { globToRegExp } = path;
Convert a glob string to a regular expression.
Tries to match bash glob expansion as closely as possible.
Basic glob syntax:
*
- Matches everything without leaving the path segment.?
- Matches any single character.{foo,bar}
- Matchesfoo
orbar
.[abcd]
- Matchesa
,b
,c
ord
.[a-d]
- Matchesa
,b
,c
ord
.[!abcd]
- Matches any single character besidesa
,b
,c
ord
.[[:<class>:]]
- Matches any character belonging to<class>
.[[:alnum:]]
- Matches any digit or letter.[[:digit:]abc]
- Matches any digit,a
,b
orc
.- See https://facelessuser.github.io/wcmatch/glob/#posix-character-classes for a complete list of supported character classes.
\
- Escapes the next character for anos
other than"windows"
.- ` - Escapes the next character for
os
set to"windows"
. /
- Path separator.\
- Additional path separator only foros
set to"windows"
.
Extended syntax:
- Requires
{ extended: true }
. ?(foo|bar)
- Matches 0 or 1 instance of{foo,bar}
.@(foo|bar)
- Matches 1 instance of{foo,bar}
. They behave the same.*(foo|bar)
- Matches n instances of{foo,bar}
.+(foo|bar)
- Matches n > 0 instances of{foo,bar}
.!(foo|bar)
- Matches anything other than{foo,bar}
.- See https://www.linuxjournal.com/content/bash-extended-globbing.
Globstar syntax:
- Requires
{ globstar: true }
. **
- Matches any number of any path segments.- Must comprise its entire path segment in the provided glob.
- See https://www.linuxjournal.com/content/globstar-new-bash-globbing-option.
Note the following properties:
- The generated
RegExp
is anchored at both start and end. - Repeating and trailing separators are tolerated. Trailing separators in the provided glob have no meaning and are discarded.
- Absolute globs will only match absolute paths, etc.
- Empty globs will match nothing.
- Any special glob syntax must be contained to one path segment. For example,
?(foo|bar/baz)
is invalid. The separator will take precedence and the first segment ends with an unclosed group. - If a path segment ends with unclosed groups or a dangling escape prefix, a parse error has occurred. Every character for that segment is taken literally in this event.
Limitations:
- A negative group like
!(foo|bar)
will wrongly be converted to a negative look-ahead followed by a wildcard. This means that!(foo).js
will wrongly fail to matchfoobar.js
, even thoughfoobar
is notfoo
. Effectively,!(foo|bar)
is treated like!(@(foo|bar)*)
. This will work correctly if the group occurs not nested at the end of the segment.
Parameters
optional
options: GlobToRegExpOptions = [UNSUPPORTED]