# core/parsers/access.parser.ts

> 31 lines of code and 12 definitions.

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

Listed in [core/parsers](https://banes-lab.com/api/source/quality/core/parsers.md), before [core/parsers/binding.parser.ts](https://banes-lab.com/source/quality/core/parsers/binding.parser.ts.md).

## Definitions

- `normalize` (lexical_declaration, line 7)
- `hitsByFile` (lexical_declaration, line 26, exported)
- `hitOf` (lexical_declaration, line 11)
- `INDEX_ACCESS_TAG` (lexical_declaration, line 4)
- `RADIX` (lexical_declaration, line 5)
- `paren` (lexical_declaration, line 12)
- `comma` (lexical_declaration, line 13)
- `close` (lexical_declaration, line 14)
- `line` (lexical_declaration, line 18)
- `column` (lexical_declaration, line 19)
- `byFile` (lexical_declaration, line 27, exported)
- `parsed` (lexical_declaration, line 29, exported)

## Contained in

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

## Used by

- [core/coordinators/access.coordinator.ts](https://banes-lab.com/source/quality/core/coordinators/access.coordinator.ts.md)

## Linked from

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

## Source

```typescript
import type { AccessHit } from "#types/access.types";
import path from "node:path";

const INDEX_ACCESS_TAG = "error TS4111";
const RADIX = 10;

const normalize = function normalize(filePath: string): string {
    return path.resolve(filePath).split("\\").join("/");
};

const hitOf = function hitOf(raw: string): { file: string; hit: AccessHit } | null {
    const paren = raw.indexOf("(");
    const comma = raw.indexOf(",", paren);
    const close = raw.indexOf(")", comma);
    if (paren === -1 || comma === -1 || close === -1) {
        return null;
    }
    const line = Number.parseInt(raw.slice(paren + 1, comma), RADIX);
    const column = Number.parseInt(raw.slice(comma + 1, close), RADIX);
    if (!Number.isInteger(line) || !Number.isInteger(column)) {
        return null;
    }
    return { file: normalize(raw.slice(0, paren)), hit: { column, line } };
};

export const hitsByFile = function hitsByFile(output: string): Map<string, AccessHit[]> {
    const byFile = new Map<string, AccessHit[]>();
    for (const raw of output.split("\n")) {
        const parsed = raw.includes(INDEX_ACCESS_TAG) ? hitOf(raw) : null;
        if (parsed !== null) {
            byFile.set(parsed.file, [...(byFile.get(parsed.file) ?? []), parsed.hit]);
        }
    }
    return byFile;
};
```
