# core/parsers/binding.parser.ts

> 25 lines of code and 11 definitions.

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

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

## Definitions

- `CANONICAL_KEY` (lexical_declaration, line 1)
- `LIST_OPEN` (lexical_declaration, line 2)
- `LIST_CLOSE` (lexical_declaration, line 3)
- `ITEM_SEPARATOR` (lexical_declaration, line 4)
- `QUOTES` (lexical_declaration, line 5)
- `unquote` (lexical_declaration, line 7)
- `trimmed` (lexical_declaration, line 8)
- `canonicalOf` (lexical_declaration, line 12, exported)
- `key` (lexical_declaration, line 13, exported)
- `open` (lexical_declaration, line 17, exported)
- `close` (lexical_declaration, line 18, exported)

## Contained in

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

## Source

```typescript
const CANONICAL_KEY = "canonical:";
const LIST_OPEN = "[";
const LIST_CLOSE = "]";
const ITEM_SEPARATOR = ",";
const QUOTES = new Set(['"', "'"]);

const unquote = function unquote(item: string): string {
    const trimmed = item.trim();
    return trimmed.length >= 2 && QUOTES.has(trimmed.charAt(0)) ? trimmed.slice(1, -1) : trimmed;
};

export const canonicalOf = function canonicalOf(text: string): string[] | null {
    const key = text.indexOf(CANONICAL_KEY);
    if (key === -1) {
        return null;
    }
    const open = text.indexOf(LIST_OPEN, key);
    const close = open === -1 ? -1 : text.indexOf(LIST_CLOSE, open);
    if (close === -1) {
        return null;
    }
    return text
        .slice(open + 1, close)
        .split(ITEM_SEPARATOR)
        .map(unquote)
        .filter((item) => item.length > 0);
};
```
