# core/validators/location.validator.ts

> 37 lines of code and 6 definitions.

Tree: GovLab Docs
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/docs#file-docs-core-validators-location-validator-ts
Source text: https://banes-lab.com/source/docs/core/validators/location.validator.ts.txt

Listed in [core/validators](https://banes-lab.com/api/source/docs/core/validators.md), after [core/validators/governance.validator.ts](https://banes-lab.com/source/docs/core/validators/governance.validator.ts.md) and before [core/validators/manifest.prose.validator.ts](https://banes-lab.com/source/docs/core/validators/manifest.prose.validator.ts.md).

## Definitions

- `locationDefects` (lexical_declaration, line 9)
- `docLocation` (lexical_declaration, line 27, exported)
- `parts` (lexical_declaration, line 10)
- `expected` (lexical_declaration, line 11)
- `filename` (lexical_declaration, line 31, exported)
- `rootPrefix` (lexical_declaration, line 32, exported)

## Contained in

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

## Uses

- [configuration/strings/location.strings.ts](https://banes-lab.com/source/docs/configuration/strings/location.strings.ts.md)
- [core/predicates/document.predicate.ts](https://banes-lab.com/source/docs/core/predicates/document.predicate.ts.md)

## Linked from

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

## Source

```typescript
import type { DocLocationDefect, DocLocationInput } from "#types/location.types";
import { boundaryMisplaced, offLocation } from "#configuration/strings/location.strings";
import { docStem, stemParts } from "#core/selectors/metadata.selector";
import { DEFAULT_ROOT_PREFIX } from "#configuration/constants/document.constants";
import { computeLocation } from "#core/resolvers/location.resolver";
import { isBoundaryFilename } from "#core/predicates/document.predicate";
import path from "node:path";

const locationDefects = function locationDefects(input: DocLocationInput, filename: string): DocLocationDefect[] {
    const parts = stemParts(docStem(filename), input.registries.forms[input.form]?.tag);
    const expected = computeLocation({
        concern: input.concern,
        form: input.form,
        ...parts,
        options: input.options,
        registries: input.registries,
    });
    if (!expected.ok) {
        return [{ code: expected.reason, detail: expected.detail }];
    }
    if (expected.path === input.relPath) {
        return [];
    }
    return [{ code: "off-location", detail: offLocation(input.relPath, expected.path), expected: expected.path }];
};

export const docLocation = function docLocation(input: DocLocationInput): DocLocationDefect[] {
    if (input.kind !== "authored") {
        return [];
    }
    const filename = path.posix.basename(input.relPath);
    const rootPrefix = input.options?.rootPrefix ?? DEFAULT_ROOT_PREFIX;
    if (!isBoundaryFilename(filename)) {
        return locationDefects(input, filename);
    }
    return input.relPath.startsWith(rootPrefix)
        ? [{ code: "boundary-misplaced", detail: boundaryMisplaced(filename, rootPrefix) }]
        : [];
};
```
