# core/converters/exclusions.converter.ts

> 25 lines of code and 8 definitions.

Tree: GovLab Quality
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/quality#file-quality-core-converters-exclusions-converter-ts
Source text: https://banes-lab.com/source/quality/core/converters/exclusions.converter.ts.txt

Listed in [core/converters](https://banes-lab.com/api/source/quality/core/converters.md), after [core/converters/eslint.converter.ts](https://banes-lab.com/source/quality/core/converters/eslint.converter.ts.md) and before [core/converters/filename.converter.ts](https://banes-lab.com/source/quality/core/converters/filename.converter.ts.md).

## Definitions

- `anchoredAt` (lexical_declaration, line 11)
- `isAnchored` (lexical_declaration, line 6)
- `exclusionsFrom` (lexical_declaration, line 22, exported)
- `SEPARATOR` (lexical_declaration, line 3)
- `NEGATION` (lexical_declaration, line 4)
- `body` (lexical_declaration, line 7)
- `tail` (lexical_declaration, line 18)
- `prefix` (lexical_declaration, line 27, exported)

## Contained in

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

## Linked from

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

## Source

```typescript
import path from "node:path";

const SEPARATOR = "/";
const NEGATION = "!";

const isAnchored = function isAnchored(pattern: string): boolean {
    const body = pattern.endsWith(SEPARATOR) ? pattern.slice(0, -1) : pattern;
    return body.includes(SEPARATOR);
};

const anchoredAt = function anchoredAt(pattern: string, prefix: string): string {
    if (pattern.startsWith(NEGATION)) {
        return NEGATION + anchoredAt(pattern.slice(1), prefix);
    }
    if (!isAnchored(pattern)) {
        return pattern;
    }
    const tail = pattern.startsWith(SEPARATOR) ? pattern.slice(1) : pattern;
    return prefix + SEPARATOR + tail;
};

export const exclusionsFrom = function exclusionsFrom(
    patterns: readonly string[],
    base: string,
    root: string,
): string[] {
    const prefix = path.relative(base, root).split(path.sep).join(SEPARATOR);
    return prefix.length === 0 ? [...patterns] : patterns.map((pattern) => anchoredAt(pattern, prefix));
};
```
