# core/matchers/segment.matcher.ts

> 25 lines of code and 8 definitions.

Tree: GovLab Docs
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/docs#file-docs-core-matchers-segment-matcher-ts
Source text: https://banes-lab.com/source/docs/core/matchers/segment.matcher.ts.txt

Listed in [core/matchers](https://banes-lab.com/api/source/docs/core/matchers.md).

## Definitions

- `expandGlob` (lexical_declaration, line 16, exported)
- `WILDCARD` (lexical_declaration, line 4)
- `segmentMatches` (lexical_declaration, line 6, exported)
- `star` (lexical_declaration, line 7, exported)
- `head` (lexical_declaration, line 11, exported)
- `tail` (lexical_declaration, line 12, exported)
- `rest]` (lexical_declaration, line 17, exported)
- `matched` (lexical_declaration, line 21, exported)

## Contained in

- [core/matchers](https://banes-lab.com/anatomy/docs/folder-docs-core-matchers.md)

## Uses

- [core/loaders/base.loader.ts](https://banes-lab.com/source/docs/core/loaders/base.loader.ts.md)

## Used by

- [core/loaders/manifest.loader.ts](https://banes-lab.com/source/docs/core/loaders/manifest.loader.ts.md)

## Linked from

- [core/loaders](https://banes-lab.com/anatomy/docs/folder-docs-core-loaders.md)

## Source

```typescript
import { isDirectory, sortedNames } from "#core/loaders/base.loader";
import { join } from "node:path";

const WILDCARD = "*";

export const segmentMatches = function segmentMatches(pattern: string, name: string): boolean {
    const star = pattern.indexOf(WILDCARD);
    if (star === -1) {
        return pattern === name;
    }
    const head = pattern.slice(0, star);
    const tail = pattern.slice(star + 1);
    return name.length >= head.length + tail.length && name.startsWith(head) && name.endsWith(tail);
};

export const expandGlob = function expandGlob(dir: string, segments: readonly string[]): string[] {
    const [head, ...rest] = segments;
    if (head === undefined) {
        return [];
    }
    const matched = sortedNames(dir)
        .filter((name) => segmentMatches(head, name))
        .map((name) => join(dir, name));
    if (rest.length === 0) {
        return matched.filter((full) => !isDirectory(full));
    }
    return matched.filter(isDirectory).flatMap((full) => expandGlob(full, rest));
};
```
