# core/resolvers/payload.resolver.ts

> 28 lines of code and 12 definitions.

Tree: Bane's Lab Build Scripts
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/build-scripts#file-build-scripts-core-resolvers-payload-resolver-ts
Source text: https://banes-lab.com/source/build-scripts/core/resolvers/payload.resolver.ts.txt

Listed in [core/resolvers](https://banes-lab.com/api/source/build-scripts/core/resolvers.md), after [core/resolvers/page.resolver.ts](https://banes-lab.com/source/build-scripts/core/resolvers/page.resolver.ts.md) and before [core/resolvers/reference.resolver.ts](https://banes-lab.com/source/build-scripts/core/resolvers/reference.resolver.ts.md).

## Definitions

- `JSON_EXTENSION` (lexical_declaration, line 4)
- `QUERY_MARK` (lexical_declaration, line 5)
- `SLASH` (lexical_declaration, line 6)
- `HOME_STEM` (lexical_declaration, line 7)
- `pathOf` (lexical_declaration, line 9, exported)
- `pageIdOf` (lexical_declaration, line 13, exported)
- `tail` (lexical_declaration, line 18, exported)
- `parts` (lexical_declaration, line 20, exported)
- `tab` (lexical_declaration, line 21, exported)
- `markdownRouteOf` (lexical_declaration, line 25, exported)
- `path` (lexical_declaration, line 26, exported)
- `stem` (lexical_declaration, line 30, exported)

## Contained in

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

## Source

```typescript
import { JSON_ROUTE, MARKDOWN_EXTENSION } from "#configuration/constants/site.constants";
import type { PayloadAddress } from "#types/payload.types";

const JSON_EXTENSION = ".json";
const QUERY_MARK = "?";
const SLASH = "/";
const HOME_STEM = "/index";

export const pathOf = function pathOf(url: string): string {
    return url.split(QUERY_MARK)[0] ?? "";
};

export const pageIdOf = function pageIdOf(url: string): PayloadAddress | null {
    const path = pathOf(url);
    if (!path.startsWith(JSON_ROUTE)) {
        return null;
    }
    const tail = path.slice(JSON_ROUTE.length);
    const stem = tail.endsWith(JSON_EXTENSION) ? tail.slice(0, -JSON_EXTENSION.length) : tail;
    const parts = stem.split(SLASH);
    const tab = parts.at(1);
    return { page: parts.at(0) ?? "", tab: tab === undefined || tab.length === 0 ? null : tab };
};

export const markdownRouteOf = function markdownRouteOf(url: string): string | null {
    const path = pathOf(url);
    if (!path.endsWith(MARKDOWN_EXTENSION)) {
        return null;
    }
    const stem = path.slice(0, -MARKDOWN_EXTENSION.length);
    return stem === HOME_STEM ? SLASH : stem;
};
```
