[go: up one dir, main page]

Skip to main content

Quickstart

Scan a directory for files matching *.ts:
import { Glob } from "bun";

const glob = new Glob("**/*.ts");

// Scans the current working directory and each of its sub-directories recursively
for await (const file of glob.scan(".")) {
	console.log(file); // => "index.ts"
}
Match a string against a glob pattern:
import { Glob } from "bun";

const glob = new Glob("*.ts");

glob.match("index.ts"); // => true
glob.match("index.js"); // => false
Glob is a class which implements the following interface:
class Glob {
	scan(root: string | ScanOptions): AsyncIterable<string>;
	scanSync(root: string | ScanOptions): Iterable<string>;

	match(path: string): boolean;
}

interface ScanOptions {
	/**
	 * The root directory to start matching from. Defaults to `process.cwd()`
	 */
	cwd?: string;

	/**
	 * Allow patterns to match entries that begin with a period (`.`).
	 *
	 * @default false
	 */
	dot?: boolean;

	/**
	 * Return the absolute path for entries.
	 *
	 * @default false
	 */
	absolute?: boolean;

	/**
	 * Indicates whether to traverse descendants of symbolic link directories.
	 *
	 * @default false
	 */
	followSymlinks?: boolean;

	/**
	 * Throw an error when symbolic link is broken
	 *
	 * @default false
	 */
	throwErrorOnBrokenSymlink?: boolean;

	/**
	 * Return only files.
	 *
	 * @default true
	 */
	onlyFiles?: boolean;
}

Supported Glob Patterns

Bun supports the following glob patterns:

? - Match any single character

const glob = new Glob("???.ts");
glob.match("foo.ts"); // => true
glob.match("foobar.ts"); // => false

* - Matches zero or more characters, except for path separators (/ or \)

const glob = new Glob("*.ts");
glob.match("index.ts"); // => true
glob.match("src/index.ts"); // => false

** - Match any number of characters including /

const glob = new Glob("**/*.ts");
glob.match("index.ts"); // => true
glob.match("src/index.ts"); // => true
glob.match("src/index.js"); // => false

[ab] - Matches one of the characters contained in the brackets, as well as character ranges

const glob = new Glob("ba[rz].ts");
glob.match("bar.ts"); // => true
glob.match("baz.ts"); // => true
glob.match("bat.ts"); // => false
You can use character ranges (e.g [0-9], [a-z]) as well as the negation operators ^ or ! to match anything except the characters contained within the braces (e.g [^ab], [!a-z])
const glob = new Glob("ba[a-z][0-9][^4-9].ts");
glob.match("bar01.ts"); // => true
glob.match("baz83.ts"); // => true
glob.match("bat22.ts"); // => true
glob.match("bat24.ts"); // => false
glob.match("ba0a8.ts"); // => false

{a,b,c} - Match any of the given patterns

const glob = new Glob("{a,b,c}.ts");
glob.match("a.ts"); // => true
glob.match("b.ts"); // => true
glob.match("c.ts"); // => true
glob.match("d.ts"); // => false
These match patterns can be deeply nested (up to 10 levels), and contain any of the wildcards from above.

! - Negates the result at the start of a pattern

const glob = new Glob("!index.ts");
glob.match("index.ts"); // => false
glob.match("foo.ts"); // => true

\ - Escapes any of the special characters above

const glob = new Glob("\\!index.ts");
glob.match("!index.ts"); // => true
glob.match("index.ts"); // => false

Node.js fs.glob() compatibility

Bun also implements Node.js’s fs.glob() functions with additional features:
import { glob, globSync, promises } from "node:fs";

// Array of patterns
const files = await promises.glob(["**/*.ts", "**/*.js"]);

// Exclude patterns
const filtered = await promises.glob("**/*", {
	exclude: ["node_modules/**", "*.test.*"],
});
All three functions (fs.glob(), fs.globSync(), fs.promises.glob()) support:
  • Array of patterns as the first argument
  • exclude option to filter results