# core/selectors/manifest.selector.ts

> 22 lines of code and 5 definitions.

Tree: Project Scripts
Language: typescript
Layer: application
Canonical: https://banes-lab.com/anatomy/scripts#file-scripts-core-selectors-manifest-selector-ts
Source text: https://banes-lab.com/source/scripts/core/selectors/manifest.selector.ts.txt

Listed in [core/selectors](https://banes-lab.com/api/source/scripts/core/selectors.md), before [core/selectors/rate.selector.ts](https://banes-lab.com/source/scripts/core/selectors/rate.selector.ts.md).

## Definitions

- `stringRecordAt` (lexical_declaration, line 9, exported)
- `exportPatternsOf` (lexical_declaration, line 19, exported)
- `stringAt` (lexical_declaration, line 4, exported)
- `found` (lexical_declaration, line 5, exported)
- `nested` (lexical_declaration, line 10, exported)

## Contained in

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

## Uses

- [core/converters/viewport.converter.ts](https://banes-lab.com/source/scripts/core/converters/viewport.converter.ts.md)

## Used by

- [core/analyzers/export.analyzer.ts](https://banes-lab.com/source/scripts/core/analyzers/export.analyzer.ts.md)
- [core/resolvers/specifier.resolver.ts](https://banes-lab.com/source/scripts/core/resolvers/specifier.resolver.ts.md)

## Linked from

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

## Source

```typescript
import { WILDCARD } from "#configuration/constants/closure.constants";
import { isRecord } from "@banes-lab/build-scripts/core/selectors/base.selector.ts";

export const stringAt = function stringAt(value: unknown, key: string): string {
    const found = isRecord(value) ? value[key] : undefined;
    return typeof found === "string" ? found : "";
};

export const stringRecordAt = function stringRecordAt(value: unknown, key: string): Readonly<Record<string, string>> {
    const nested = isRecord(value) ? value[key] : undefined;
    if (!isRecord(nested)) {
        return {};
    }
    return Object.fromEntries(
        Object.entries(nested).flatMap(([name, target]) => (typeof target === "string" ? [[name, target]] : [])),
    );
};

export const exportPatternsOf = function exportPatternsOf(manifest: unknown): readonly (readonly [string, string])[] {
    return Object.entries(stringRecordAt(manifest, "exports"))
        .flatMap(([key, target]): [string, string][] =>
            key.endsWith(WILDCARD) ? [[key.slice(0, -WILDCARD.length), target]] : [],
        )
        .toSorted(([left], [right]) => right.length - left.length);
};
```
