Skip to content

Быстрый старт

Сканирование директории на файлы, соответствующие *.ts:

ts
import { Glob } from "bun";

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

// Сканирует текущую рабочую директорию и каждую из её поддиректорий рекурсивно
for await (const file of glob.scan(".")) {
  console.log(file); // => "index.ts"
}

Сопоставление строки с шаблоном glob:

ts
import { Glob } from "bun";

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

glob.match("index.ts"); // => true
glob.match("index.js"); // => false

Glob — это класс, который реализует следующий интерфейс:

ts
class Glob {
  scan(root: string | ScanOptions): AsyncIterable<string>;
  scanSync(root: string | ScanOptions): Iterable<string>;

  match(path: string): boolean;
}

interface ScanOptions {
  /**
   * Корневая директория, с которой начинается сопоставление. По умолчанию `process.cwd()`
   */
  cwd?: string;

  /**
   * Разрешить шаблонам сопоставлять записи, начинающиеся с точки (`.`).
   *
   * @default false
   */
  dot?: boolean;

  /**
   * Вернуть абсолютный путь для записей.
   *
   * @default false
   */
  absolute?: boolean;

  /**
   * Указывает, следует ли обходить потомков каталогов символических ссылок.
   *
   * @default false
   */
  followSymlinks?: boolean;

  /**
   * Выбросить ошибку, когда символическая ссылка нарушена
   *
   * @default false
   */
  throwErrorOnBrokenSymlink?: boolean;

  /**
   * Вернуть только файлы.
   *
   * @default true
   */
  onlyFiles?: boolean;
}

Поддерживаемые шаблоны Glob

Bun поддерживает следующие шаблоны glob:

? — Сопоставление любого одиночного символа

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

* — Сопоставление нуля или более символов, кроме разделителей путей (/ или \)

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

** — Сопоставление любого количества символов, включая /

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

[ab] — Сопоставление одного из символов, содержащихся в скобках, а также диапазонов символов

ts
const glob = new Glob("ba[rz].ts");
glob.match("bar.ts"); // => true
glob.match("baz.ts"); // => true
glob.match("bat.ts"); // => false

Вы можете использовать диапазоны символов (например, [0-9], [a-z]), а также операторы отрицания ^ или ! для сопоставления всего, кроме символов, содержащихся в скобках (например, [^ab], [!a-z]).

ts
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} — Сопоставление любого из заданных шаблонов

ts
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

Эти шаблоны могут быть глубоко вложены (до 10 уровней) и содержать любые подстановочные знаки из вышеперечисленных.

! — Отрицает результат в начале шаблона

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

\ — Экранирует любой из специальных символов выше

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

Совместимость с Node.js fs.glob()

Bun также реализует функции fs.glob() из Node.js с дополнительными возможностями:

ts
import { glob, globSync, promises } from "node:fs";

// Массив шаблонов
const files = await promises.glob(["**/*.ts", "**/*.js"]);

// Исключение шаблонов
const filtered = await promises.glob("**/*", {
  exclude: ["node_modules/**", "*.test.*"],
});

Все три функции (fs.glob(), fs.globSync(), fs.promises.glob()) поддерживают:

  • Массив шаблонов в качестве первого аргумента
  • Опцию exclude для фильтрации результатов

Bun от www.bunjs.com.cn