# core/converters/catalog.converter.ts

> 51 lines of code and 22 definitions.

Tree: Bane's Lab Deploy
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/deploy#file-deploy-core-converters-catalog-converter-ts
Source text: https://banes-lab.com/source/deploy/core/converters/catalog.converter.ts.txt

Listed in [core/converters](https://banes-lab.com/api/source/deploy/core/converters.md), before [core/converters/failure.converter.ts](https://banes-lab.com/source/deploy/core/converters/failure.converter.ts.md).

## Definitions

- `textOf` (lexical_declaration, line 15)
- `listOf` (lexical_declaration, line 19)
- `rowFrom` (lexical_declaration, line 23)
- `fieldOf` (lexical_declaration, line 11)
- `shardAddresses` (lexical_declaration, line 48, exported)
- `shardRow` (lexical_declaration, line 55, exported)
- `ROOT_LISTS` (lexical_declaration, line 3)
- `JSON_COLUMN` (lexical_declaration, line 4)
- `MARKDOWN_COLUMN` (lexical_declaration, line 5)
- `BYTES_COLUMN` (lexical_declaration, line 6)
- `FINGERPRINT_COLUMN` (lexical_declaration, line 7)
- `REF_COLUMN` (lexical_declaration, line 8)
- `TITLE_COLUMN` (lexical_declaration, line 9)
- `json` (lexical_declaration, line 24)
- `bytes` (lexical_declaration, line 25)
- `fingerprint` (lexical_declaration, line 26)
- `rootRows` (lexical_declaration, line 40, exported)
- `[first]` (lexical_declaration, line 42, exported)
- `row` (lexical_declaration, line 43, exported)
- `address` (lexical_declaration, line 50, exported)
- `columns` (lexical_declaration, line 56, exported)
- `[cells]` (lexical_declaration, line 57, exported)

## Contained in

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

## Used by

- [core/loaders/environment.loader.ts](https://banes-lab.com/source/deploy/core/loaders/environment.loader.ts.md)

## Linked from

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

## Source

```typescript
import type { CatalogRow } from "#types/deployment.types";

const ROOT_LISTS: readonly string[] = ["collections", "documents", "pages", "queries", "trees"];
const JSON_COLUMN = "json";
const MARKDOWN_COLUMN = "markdown";
const BYTES_COLUMN = "bytes";
const FINGERPRINT_COLUMN = "fingerprint";
const REF_COLUMN = "ref";
const TITLE_COLUMN = "title";

const fieldOf = function fieldOf(value: unknown, key: string): unknown {
    return typeof value === "object" && value !== null && key in value ? Reflect.get(value, key) : undefined;
};

const textOf = function textOf(value: unknown): string | null {
    return typeof value === "string" ? value : null;
};

const listOf = function listOf(value: unknown): readonly unknown[] {
    return Array.isArray(value) ? value : [];
};

const rowFrom = function rowFrom(read: (column: string) => unknown): CatalogRow | null {
    const json = textOf(read(JSON_COLUMN));
    const bytes = read(BYTES_COLUMN);
    const fingerprint = textOf(read(FINGERPRINT_COLUMN));
    if (json === null || typeof bytes !== "number" || fingerprint === null) {
        return null;
    }
    return {
        bytes,
        fingerprint,
        json,
        markdown: textOf(read(MARKDOWN_COLUMN)),
        ref: textOf(read(REF_COLUMN)),
        title: textOf(read(TITLE_COLUMN)),
    };
};

export const rootRows = function rootRows(root: unknown): readonly CatalogRow[] {
    return ROOT_LISTS.flatMap((key) => {
        const [first] = listOf(fieldOf(root, key));
        const row = rowFrom((column) => fieldOf(first, column));
        return row === null ? [] : [row];
    });
};

export const shardAddresses = function shardAddresses(head: unknown): readonly string[] {
    return listOf(fieldOf(head, "shards")).flatMap((shard) => {
        const address = textOf(fieldOf(shard, JSON_COLUMN));
        return address === null ? [] : [address];
    });
};

export const shardRow = function shardRow(shard: unknown): CatalogRow | null {
    const columns = listOf(fieldOf(shard, "columns"));
    const [cells] = listOf(fieldOf(shard, "rows"));
    return rowFrom((column) => listOf(cells)[columns.indexOf(column)]);
};
```
