# core/converters/surface.converter.ts

> 25 lines of code and 4 definitions.

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

Listed in [core/converters](https://banes-lab.com/api/source/quality/core/converters.md), after [core/converters/stylelint.converter.ts](https://banes-lab.com/source/quality/core/converters/stylelint.converter.ts.md) and before [core/converters/target.converter.ts](https://banes-lab.com/source/quality/core/converters/target.converter.ts.md).

## Definitions

- `mergeSurface` (lexical_declaration, line 3)
- `mergeOwnership` (lexical_declaration, line 16, exported)
- `merged` (lexical_declaration, line 7)
- `langMap` (lexical_declaration, line 24, exported)

## Contained in

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

## Linked from

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

## Source

```typescript
import type { OwnerOverride, OwnershipSurface } from "#types/canon.types";

const mergeSurface = function mergeSurface(
    surface: OwnershipSurface,
    langMap: Record<string, string>,
): OwnershipSurface {
    const merged: OwnershipSurface = { ...surface, ownerByLanguage: { ...surface.ownerByLanguage } };
    for (const [lang, tool] of Object.entries(langMap)) {
        if (!surface.fixedOwners.includes(lang)) {
            merged.ownerByLanguage[lang] = tool;
        }
    }
    return merged;
};

export const mergeOwnership = function mergeOwnership(
    surfaces: OwnershipSurface[],
    override?: OwnerOverride,
): OwnershipSurface[] {
    if (!override) {
        return surfaces;
    }
    return surfaces.map((surface) => {
        const langMap = override[surface.id];
        return langMap ? mergeSurface(surface, langMap) : surface;
    });
};
```
