Glob patterns let you include or exclude sets of paths with compact wildcard expressions, similar to regular expressions or .gitignore patterns.

Glob-matching implementations can vary between libraries, so be sure to test your patterns in our environment. Contact us if you have any questions or run into issues.

Examples of Common Patterns

Some everyday use cases for globs:

Use‑casePattern
All files at any depth**
All markdown files at any depth**/*.md
All files in src/src/**
All TypeScript & TSX in src/src/**/*.{ts,tsx}
Only test files (Jest style)**/*.{test,spec}.{ts,tsx}
Everything except node_modules**
!**/node_modules/**

Basic Patterns

Wildcard *

* matches any string within a path segment, but not across directory boundaries.

It’s a common mistake to use * when you meant to use the globstar ** - see below.

pattern: src/*
✅ src/README.md
✅ src/index.ts
❌ src/utils/index.ts  // '*' does not cross directory boundaries

pattern: src/*.ts
✅ src/index.ts
❌ src/README.md       // does not have a .ts extension
❌ src/utils/index.ts  // '*' does not cross directory boundaries

pattern: *
✅ README.md
❌ src/index.ts        // '*' does not cross directory boundaries

Globstar **

** matches any string (including empty) across directory boundaries. Using ** is the most common way to match all files in a directory.

pattern: **
// matches all files everywhere

pattern: src/**
✅ src/main.py
✅ src/utils/func.py
✅ src/utils/foo/bar/baz/func.py
❌ test/test_main.py      // does not match 'src/' prefix

pattern: assets/**/*.png
✅ assets/logo.png
✅ assets/icons/flag/us.png
❌ assets/logo.svg        // does not match '.png' extension

pattern: **/src/**/util/**
✅ src/util/README.md
✅ src/foo/util/bar/README.md
✅ foo/src/bar/util/baz/README.md
❌ src/README.md
❌ util/src/README.md
❌ util/util/README.md
❌ srcutil/README.md

Brace expansion {a,b}

Expands into multiple literal alternatives before matching.

So, src/**/*.{ts,tsx} expands into two patterns: src/**/*.ts and src/**/*.tsx

pattern: {src,tests}/**/*.py
✅ src/main/app.py
✅ tests/unit/test_app.py
❌ docs/app.py   // directory not in `src` or `tests`

pattern: src/**/*.{ts,tsx}
✅ src/index.ts
✅ src/index.tsx
✅ src/utils/index.ts
✅ src/utils/index.tsx
❌ src/README.md   // does not match '.ts' or '.tsx' extension
❌ test/index.ts   // does not match 'src/' prefix

Negation !pattern

Prefix a pattern with ! to exclude it.

Negation is usually used in conjunction with multiple patterns.Patterns are evaluated in the order they are listed. So, you typically want your first pattern to be the most inclusive, followed by a series of negations.

patterns:
  src/utils/**
  !src/utils/deprecated/**

✅ src/utils/users/main.py
✅ src/utils/analytics/overview.py
❌ src/utils/deprecated/main.py  // negated
❌ test/test_index.py            // did not match any patterns

Make sure to include a negation pattern after the relevant include pattern; otherwise, because patterns are evaluated in order, the negation will have no effect. For example, the list of patterns ["!src/utils/**", "**"] will not exclude anything, and will instead match all files.


Extras

These are less commonly used, but useful to know about.


Ellipsis custom handling

To cover some edge cases we commonly see in production, we have some custom handling of glob patterns to reduce footguns.

Forgetting to append /**

It’s common for developers to reach for .gitignore-style patterns, which don’t require using the globstar **. So, we expand patterns that don’t end in /** to include all files in the directory.

src => src/**

src/ => src/**

pattern: src/
✅ src/index.ts
✅ src/utils/index.ts
❌ srces

Dot‑files

Although dotfiles are commonly excluded by default in many globbing tools, Ellipsis enables them by default.

pattern: **
✅ .foo
✅ dir/.foo

Negation without matching patterns

It’s a common mistake to include a negation pattern without any matching patterns before it. So, if all patterns in a list are negated, Ellipsis will automatically insert a ** pattern to run first in the list to ensure some files are included.

patterns: 
  !src/utils/**  // expanded into ["**", "!src/utils/**"]

✅ README.md
✅ src/index.ts
✅ src/worker/main.py
✅ test/test_index.py
❌ src/utils/users/index.ts
❌ src/utils/analytics/overview.tsx
❌ src/utils/deprecated/index.tsx

Triple stars (***)

Using *** is usually a typo where the user meant to write **. So, we rewrite them to **.

*** => **

src/***/foo => src/**/foo