# core/selectors/exclusions.selector.ts

> 35 lines of code and 10 definitions.

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

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

## Definitions

- `withMasterExclude` (lexical_declaration, line 9, exported)
- `masterExcludeMarkers` (lexical_declaration, line 30, exported)
- `masterExclude` (lexical_declaration, line 7, exported)
- `GLOB_PREFIX` (lexical_declaration, line 3)
- `GLOB_SUFFIX` (lexical_declaration, line 4)
- `SLASH` (lexical_declaration, line 5)
- `stripGlob` (lexical_declaration, line 13)
- `markers` (lexical_declaration, line 31, exported)
- `own` (lexical_declaration, line 32, exported)
- `inner` (lexical_declaration, line 34, exported)

## Contained in

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

## Used by

- [core/adapters/stylelint.adapter.ts](https://banes-lab.com/source/quality/core/adapters/stylelint.adapter.ts.md)
- [core/adapters/tool.htmlhint.adapter.ts](https://banes-lab.com/source/quality/core/adapters/tool.htmlhint.adapter.ts.md)
- [core/adapters/tool.jscpd.adapter.ts](https://banes-lab.com/source/quality/core/adapters/tool.jscpd.adapter.ts.md)
- [core/adapters/tool.knip.adapter.ts](https://banes-lab.com/source/quality/core/adapters/tool.knip.adapter.ts.md)
- [core/adapters/tool.oxlint.adapter.ts](https://banes-lab.com/source/quality/core/adapters/tool.oxlint.adapter.ts.md)
- [core/adapters/tool.prettier.adapter.ts](https://banes-lab.com/source/quality/core/adapters/tool.prettier.adapter.ts.md)
- [core/factories/exclusions.factory.ts](https://banes-lab.com/source/quality/core/factories/exclusions.factory.ts.md)
- [core/resolvers/scope.resolver.ts](https://banes-lab.com/source/quality/core/resolvers/scope.resolver.ts.md)
- [core/selectors/config.selector.ts](https://banes-lab.com/source/quality/core/selectors/config.selector.ts.md)

## Linked from

- [core/adapters](https://banes-lab.com/anatomy/quality/folder-quality-core-adapters.md)
- [core/factories](https://banes-lab.com/anatomy/quality/folder-quality-core-factories.md)
- [core/resolvers](https://banes-lab.com/anatomy/quality/folder-quality-core-resolvers.md)
- [core/selectors](https://banes-lab.com/anatomy/quality/folder-quality-core-selectors.md)

## Source

```typescript
import type { GovlabConfig } from "#types/config.types";

const GLOB_PREFIX = "**/";
const GLOB_SUFFIX = "/**";
const SLASH = "/";

export const masterExclude = (config: GovlabConfig): string[] => config.qualityMaster?.exclude ?? [];

export const withMasterExclude = (config: GovlabConfig, own: string[]): string[] => [
    ...new Set<string>([...masterExclude(config), ...own]),
];

const stripGlob = (pattern: string): string => {
    let inner = pattern;
    while (inner.startsWith(GLOB_PREFIX)) {
        inner = inner.slice(GLOB_PREFIX.length);
    }
    while (inner.endsWith(GLOB_SUFFIX)) {
        inner = inner.slice(0, -GLOB_SUFFIX.length);
    }
    if (inner.startsWith(SLASH)) {
        inner = inner.slice(1);
    }
    if (inner.endsWith(SLASH)) {
        inner = inner.slice(0, -1);
    }
    return inner;
};

export const masterExcludeMarkers = (config: GovlabConfig, tool?: string): string[] => {
    const markers = new Set<string>();
    const own = tool === undefined ? [] : (config.qualityMaster?.toolExclude?.[tool] ?? []);
    for (const pattern of [...masterExclude(config), ...own]) {
        const inner = stripGlob(pattern);
        if (inner.length > 0) {
            markers.add(inner);
        }
    }
    return [...markers];
};
```
