# core/converters/company.converter.ts

> 50 lines of code and 8 definitions.

Tree: Bane's Lab Build Scripts
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/build-scripts#file-build-scripts-core-converters-company-converter-ts
Source text: https://banes-lab.com/source/build-scripts/core/converters/company.converter.ts.txt

Listed in [core/converters](https://banes-lab.com/api/source/build-scripts/core/converters.md), after [core/converters/check.converter.ts](https://banes-lab.com/source/build-scripts/core/converters/check.converter.ts.md) and before [core/converters/config.converter.ts](https://banes-lab.com/source/build-scripts/core/converters/config.converter.ts.md).

## Definitions

- `field` (lexical_declaration, line 15)
- `contactOf` (lexical_declaration, line 23, exported)
- `contactLeaf` (lexical_declaration, line 43, exported)
- `CONTACT_REF` (lexical_declaration, line 13)
- `value` (lexical_declaration, line 16)
- `{ company, links }` (lexical_declaration, line 24, exported)
- `identity` (lexical_declaration, line 44, exported)
- `data` (lexical_declaration, line 52, exported)

## Contained in

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

## Uses

- [configuration/strings/catalog.strings.ts](https://banes-lab.com/source/build-scripts/configuration/strings/catalog.strings.ts.md)
- [core/formatters/company.formatter.ts](https://banes-lab.com/source/build-scripts/core/formatters/company.formatter.ts.md)

## Linked from

- [configuration/strings](https://banes-lab.com/anatomy/build-scripts/folder-build-scripts-configuration-strings.md)
- [core/converters](https://banes-lab.com/anatomy/build-scripts/folder-build-scripts-core-converters.md)
- [core/formatters](https://banes-lab.com/anatomy/build-scripts/folder-build-scripts-core-formatters.md)

## Source

```typescript
import {
    CONTACT_TITLE,
    GRAMMAR_REPOSITORY_LABEL,
    METHODOLOGY_REPOSITORY_LABEL,
    nonStringValue,
} from "#configuration/strings/catalog.strings";
import type { ContactData, Identity, Leaf } from "#types/catalog.types";
import { INDEX_KIND } from "#configuration/constants/catalog.constants";
import type { WebModules } from "#types/loader.types";
import { contactIndex } from "#core/resolvers/catalog.resolver";
import { renderContact } from "#core/formatters/company.formatter";

const CONTACT_REF = "api:contact";

const field = function field(module: Readonly<Record<string, unknown>>, key: string): string {
    const value = module[key];
    if (typeof value !== "string") {
        throw new TypeError(nonStringValue(key));
    }
    return value;
};

export const contactOf = function contactOf(web: Pick<WebModules, "company" | "links">): ContactData {
    const { company, links } = web;
    return {
        address: field(company, "COMPANY_ADDRESS"),
        company: field(company, "COMPANY_NAME"),
        country: field(company, "COMPANY_COUNTRY"),
        email: field(company, "COMPANY_EMAIL"),
        founded: field(company, "COMPANY_FOUNDED"),
        links: {
            [field(company, "GITHUB_LINK_TITLE")]: field(links, "AUTHOR_GITHUB"),
            [field(company, "LINKEDIN_LINK_TITLE")]: field(links, "AUTHOR_PROFILE"),
            [GRAMMAR_REPOSITORY_LABEL]: field(links, "GRAMMAR_REPOSITORY"),
            [METHODOLOGY_REPOSITORY_LABEL]: field(links, "METHODOLOGY_REPOSITORY"),
        },
        number: field(company, "COMPANY_NUMBER"),
        owner: field(company, "COMPANY_OWNER"),
        reply: field(company, "REPLY_NOTE"),
    };
};

export const contactLeaf = function contactLeaf(contact: ContactData, site: string): Leaf {
    const identity: Identity = {
        address: contactIndex(),
        href: null,
        kind: INDEX_KIND,
        ref: CONTACT_REF,
        summary: contact.reply,
        title: CONTACT_TITLE,
    };
    const data = { ...contact, ref: CONTACT_REF, site, title: contact.company };
    return { data, identity, markdown: renderContact(data, site) };
};
```
