# core/loaders/build.loader.ts

> 34 lines of code and 10 definitions.

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

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

## Definitions

- `readOrNull` (lexical_declaration, line 13, exported)
- `buildOutput` (lexical_declaration, line 9, exported)
- `SLASH` (lexical_declaration, line 7)
- `bytesOrNull` (lexical_declaration, line 18, exported)
- `target` (lexical_declaration, line 19, exported)
- `sourcePagePaths` (lexical_declaration, line 23, exported)
- `root` (lexical_declaration, line 24, exported)
- `file` (lexical_declaration, line 31, exported)
- `pageIds` (lexical_declaration, line 37, exported)
- `ids` (lexical_declaration, line 38, exported)

## Contained in

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

## Used by

- [core/coordinators/validation.coordinator.ts](https://banes-lab.com/source/build-scripts/core/coordinators/validation.coordinator.ts.md)
- [core/validators/asset.validator.ts](https://banes-lab.com/source/build-scripts/core/validators/asset.validator.ts.md)
- [core/validators/build.validator.ts](https://banes-lab.com/source/build-scripts/core/validators/build.validator.ts.md)
- [core/validators/source.page.validator.ts](https://banes-lab.com/source/build-scripts/core/validators/source.page.validator.ts.md)

## Linked from

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

## Source

```typescript
import { existsSync, readFileSync, readdirSync } from "node:fs";
import { join, relative } from "node:path";
import { PAGE_EXTENSION } from "#configuration/constants/asset.constants";
import { absolutePath } from "@ssot/paths";
import { toPosix } from "#core/resolvers/asset.resolver";

const SLASH = "/";

export const buildOutput = function buildOutput(): string {
    return absolutePath("builds.web");
};

export const readOrNull = function readOrNull(file: string): string | null {
    const target = join(buildOutput(), file);
    return existsSync(target) ? readFileSync(target, "utf8") : null;
};

export const bytesOrNull = function bytesOrNull(file: string): Buffer | null {
    const target = join(buildOutput(), file);
    return existsSync(target) ? readFileSync(target) : null;
};

export const sourcePagePaths = function sourcePagePaths(page: string): readonly string[] {
    const root = join(buildOutput(), page);
    if (!existsSync(root)) {
        return [];
    }
    return readdirSync(root, { recursive: true, withFileTypes: true })
        .filter((entry) => entry.isFile() && entry.name.endsWith(PAGE_EXTENSION) && entry.parentPath !== root)
        .map((entry) => {
            const file = toPosix(relative(buildOutput(), join(entry.parentPath, entry.name)));
            return SLASH + file.slice(0, -PAGE_EXTENSION.length);
        })
        .toSorted((left, right) => left.localeCompare(right));
};

export const pageIds = async function pageIds(): Promise<readonly string[]> {
    const ids = await import("@banes-lab/web/core/ids/page.ids.ts");
    return Object.values(ids);
};
```
