# core/loaders/section.loader.ts

> 29 lines of code and 8 definitions.

Tree: GovLab Docs
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/docs#file-docs-core-loaders-section-loader-ts
Source text: https://banes-lab.com/source/docs/core/loaders/section.loader.ts.txt

Listed in [core/loaders](https://banes-lab.com/api/source/docs/core/loaders.md), after [core/loaders/registry.loader.ts](https://banes-lab.com/source/docs/core/loaders/registry.loader.ts.md) and before [core/loaders/syntax.loader.ts](https://banes-lab.com/source/docs/core/loaders/syntax.loader.ts.md).

## Definitions

- `isManifestPlugin` (lexical_declaration, line 11)
- `EXPORT_KEY` (lexical_declaration, line 8)
- `EXTENSION_PLUGINS_DIR` (lexical_declaration, line 9)
- `byName` (lexical_declaration, line 15)
- `loadPlugins` (lexical_declaration, line 19, exported)
- `plugins` (lexical_declaration, line 20, exported)
- `loadUserManifestPlugins` (lexical_declaration, line 24, exported)
- `perExtension` (lexical_declaration, line 28, exported)

## Contained in

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

## Uses

- [core/predicates/record.predicate.ts](https://banes-lab.com/source/docs/core/predicates/record.predicate.ts.md)

## Linked from

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

## Source

```typescript
import type { ManifestPlugin } from "#types/manifest.types";
import { absolutePath } from "@ssot/paths";
import { extensionDirs } from "#core/loaders/registry.loader";
import { isRecord } from "#core/predicates/record.predicate";
import { join } from "node:path";
import { loadExports } from "#core/loaders/plugin.loader";

const EXPORT_KEY = "plugin";
const EXTENSION_PLUGINS_DIR = "manifest-plugins";

const isManifestPlugin = function isManifestPlugin(value: unknown): value is ManifestPlugin {
    return isRecord(value) && typeof value["name"] === "string";
};

const byName = function byName(left: ManifestPlugin, right: ManifestPlugin): number {
    return left.name.localeCompare(right.name);
};

export const loadPlugins = async function loadPlugins(): Promise<ManifestPlugin[]> {
    const plugins = await loadExports(absolutePath("govlab.docs.plugins"), EXPORT_KEY, isManifestPlugin);
    return plugins.toSorted(byName);
};

export const loadUserManifestPlugins = async function loadUserManifestPlugins(
    root: string,
    options: { allowGlobal?: boolean } = {},
): Promise<ManifestPlugin[]> {
    const perExtension = await Promise.all(
        extensionDirs(root, options.allowGlobal ?? false).map(async (dir) =>
            loadExports(join(dir, EXTENSION_PLUGINS_DIR), EXPORT_KEY, isManifestPlugin),
        ),
    );
    return perExtension.flat().toSorted(byName);
};
```
