# core/loaders/folder.loader.ts

> 18 lines of code and 4 definitions.

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

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

## Definitions

- `readdirSafe` (lexical_declaration, line 5, exported)
- `walkFiles` (lexical_declaration, line 13, exported)
- `readdirOrNull` (lexical_declaration, line 9, exported)
- `abs` (lexical_declaration, line 15, exported)

## Contained in

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

## Uses

- [runtime/entrypoints/metric.entrypoint.ts](https://banes-lab.com/source/stats/runtime/entrypoints/metric.entrypoint.ts.md)

## Used by

- [core/analyzers/site.analyzer.ts](https://banes-lab.com/source/stats/core/analyzers/site.analyzer.ts.md)
- [core/analyzers/taxonomy.analyzer.ts](https://banes-lab.com/source/stats/core/analyzers/taxonomy.analyzer.ts.md)
- [core/loaders/document.loader.ts](https://banes-lab.com/source/stats/core/loaders/document.loader.ts.md)
- [core/resolvers/package.resolver.ts](https://banes-lab.com/source/stats/core/resolvers/package.resolver.ts.md)

## Linked from

- [core/analyzers](https://banes-lab.com/anatomy/stats/folder-stats-core-analyzers.md)
- [core/loaders](https://banes-lab.com/anatomy/stats/folder-stats-core-loaders.md)
- [core/resolvers](https://banes-lab.com/anatomy/stats/folder-stats-core-resolvers.md)
- [runtime/entrypoints](https://banes-lab.com/anatomy/stats/folder-stats-runtime-entrypoints.md)

## Source

```typescript
import { type Dirent, existsSync, readdirSync, statSync } from "node:fs";
import type { PathExclusion } from "@govlab/quality/config";
import { join } from "node:path";

export const readdirSafe = function readdirSafe(dir: string): Dirent[] {
    return existsSync(dir) && statSync(dir).isDirectory() ? readdirSync(dir, { withFileTypes: true }) : [];
};

export const readdirOrNull = function readdirOrNull(dir: string): Dirent[] | null {
    return existsSync(dir) && statSync(dir).isDirectory() ? readdirSync(dir, { withFileTypes: true }) : null;
};

export const walkFiles = function walkFiles(absDir: string, ignore: PathExclusion): string[] {
    return readdirSafe(absDir).flatMap((entry) => {
        const abs = join(absDir, entry.name);
        if (entry.isDirectory()) {
            return ignore(abs) ? [] : walkFiles(abs, ignore);
        }
        return entry.isFile() ? [abs] : [];
    });
};
```
