# core/resolvers/coverage.resolver.ts

> 30 lines of code and 10 definitions.

Tree: GovLab Quality
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/quality#file-quality-core-resolvers-coverage-resolver-ts
Source text: https://banes-lab.com/source/quality/core/resolvers/coverage.resolver.ts.txt

Listed in [core/resolvers](https://banes-lab.com/api/source/quality/core/resolvers.md), after [core/resolvers/canon.resolver.ts](https://banes-lab.com/source/quality/core/resolvers/canon.resolver.ts.md) and before [core/resolvers/layer.resolver.ts](https://banes-lab.com/source/quality/core/resolvers/layer.resolver.ts.md).

## Definitions

- `resolveScope` (lexical_declaration, line 15, exported)
- `specifierOf` (lexical_declaration, line 10)
- `rel` (lexical_declaration, line 11)
- `pkg` (lexical_declaration, line 16, exported)
- `normalizedRoot` (lexical_declaration, line 20, exported)
- `testRoot` (lexical_declaration, line 21, exported)
- `colocated` (lexical_declaration, line 22, exported)
- `centralized` (lexical_declaration, line 23, exported)
- `text` (lexical_declaration, line 24, exported)
- `stem` (lexical_declaration, line 25, exported)

## Contained in

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

## Uses

- [core/matchers/word.matcher.ts](https://banes-lab.com/source/quality/core/matchers/word.matcher.ts.md)

## Used by

- [core/quality/eslint/require-test-coverage.eslint.rule.ts](https://banes-lab.com/source/quality/core/quality/eslint/require-test-coverage.eslint.rule.ts.md)

## Linked from

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

## Source

```typescript
import { centralIndexFor, packageIndexFor } from "#core/loaders/coverage.loader";
import { enclosingPackages, findPackageRoot } from "#core/resolvers/package.resolver";
import { forwardSlashed, stripExtension } from "#core/converters/filename.converter";
import { ROOT } from "@ssot/paths/anchor";
import type { Scope } from "#types/coverage.types";
import path from "node:path";
import { relativePath } from "@ssot/paths";
import { wordIncludes } from "#core/matchers/word.matcher";

const specifierOf = function specifierOf(file: string): string {
    const rel = forwardSlashed(path.relative(ROOT, file));
    return rel.startsWith("..") ? file : rel;
};

export const resolveScope = function resolveScope(file: string): Scope | null {
    const pkg = findPackageRoot(file.slice(0, file.lastIndexOf("/")));
    if (pkg === null) {
        return null;
    }
    const normalizedRoot = forwardSlashed(ROOT);
    const testRoot = forwardSlashed(path.join(normalizedRoot, relativePath("codebase.testing")));
    const colocated = [pkg, ...enclosingPackages(pkg)].map((root) => packageIndexFor(root).get(pkg) ?? "").join("\n");
    const centralized = centralIndexFor(testRoot, normalizedRoot).get(pkg) ?? "";
    const text = `${colocated}\n${centralized}`;
    const stem = stripExtension(file.slice(file.lastIndexOf("/") + 1));
    return {
        coversDefault: () => wordIncludes(text, stem),
        coversName: (symbol) => wordIncludes(text, symbol),
        label: pkg,
        specifier: specifierOf(file),
    };
};
```
