# core/validators/catalog.location.validator.ts

> 29 lines of code and 6 definitions.

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

Listed in [core/validators](https://banes-lab.com/api/source/build-scripts/core/validators.md), after [core/validators/catalog.kind.validator.ts](https://banes-lab.com/source/build-scripts/core/validators/catalog.kind.validator.ts.md) and before [core/validators/catalog.validator.ts](https://banes-lab.com/source/build-scripts/core/validators/catalog.validator.ts.md).

## Definitions

- `sitemapFindings` (lexical_declaration, line 10, exported)
- `file` (lexical_declaration, line 16, exported)
- `parts` (lexical_declaration, line 20, exported)
- `locations` (lexical_declaration, line 21, exported)
- `listed` (lexical_declaration, line 22, exported)
- `leaves` (lexical_declaration, line 23, exported)

## Contained in

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

## Uses

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

## Used by

- [core/validators/catalog.validator.ts](https://banes-lab.com/source/build-scripts/core/validators/catalog.validator.ts.md)

## Linked from

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

## Source

```typescript
import { NO_CATALOG_SITEMAP, strayInSitemap, unlistedInSitemap } from "#configuration/strings/catalog.strings";
import { fileOfAddress, localAddress } from "#core/resolvers/catalog.resolver";
import { CATALOG_SITEMAP_ROUTE } from "#configuration/constants/site.constants";
import type { Finding } from "#types/validation.types";
import { join } from "node:path";
import { locationsOf } from "#core/converters/build.converter";
import { readFileSync } from "node:fs";
import { sitemapPartFiles } from "#core/resolvers/route.resolver";

export const sitemapFindings = function sitemapFindings(
    outDir: string,
    site: string,
    markdownLeaves: readonly string[],
    present: ReadonlySet<string>,
): Finding[] {
    const file = CATALOG_SITEMAP_ROUTE.slice(1);
    if (!present.has(file)) {
        return [{ file, message: NO_CATALOG_SITEMAP }];
    }
    const parts = sitemapPartFiles(CATALOG_SITEMAP_ROUTE, (held) => present.has(held));
    const locations = parts.flatMap((held) => locationsOf(readFileSync(join(outDir, held), "utf8")));
    const listed = new Set(locations.map((location) => fileOfAddress(localAddress(site, location))));
    const leaves = new Set(markdownLeaves);
    return [
        ...markdownLeaves
            .filter((leaf) => !listed.has(leaf))
            .map((leaf) => ({ file, message: unlistedInSitemap(leaf) })),
        ...[...listed].filter((leaf) => !leaves.has(leaf)).map((leaf) => ({ file, message: strayInSitemap(leaf) })),
    ];
};
```
