# core/predicates/readme.predicate.ts

> 17 lines of code and 5 definitions.

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

Listed in [core/predicates](https://banes-lab.com/api/source/docs/core/predicates.md), after [core/predicates/program.predicate.ts](https://banes-lab.com/source/docs/core/predicates/program.predicate.ts.md) and before [core/predicates/record.predicate.ts](https://banes-lab.com/source/docs/core/predicates/record.predicate.ts.md).

## Definitions

- `isNonEmptyString` (lexical_declaration, line 4, exported)
- `isRenderable` (lexical_declaration, line 16, exported)
- `isStringArray` (lexical_declaration, line 8, exported)
- `isFlatRecordArray` (lexical_declaration, line 12)
- `isApiNote` (lexical_declaration, line 20, exported)

## Contained in

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

## Uses

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

## Used by

- [core/plugins/manifest.document.plugin.ts](https://banes-lab.com/source/docs/core/plugins/manifest.document.plugin.ts.md)
- [core/plugins/manifest.governance.plugin.ts](https://banes-lab.com/source/docs/core/plugins/manifest.governance.plugin.ts.md)
- [core/plugins/manifest.readme.plugin.ts](https://banes-lab.com/source/docs/core/plugins/manifest.readme.plugin.ts.md)
- [core/validators/manifest.validator.ts](https://banes-lab.com/source/docs/core/validators/manifest.validator.ts.md)

## Linked from

- [core/plugins](https://banes-lab.com/anatomy/docs/folder-docs-core-plugins.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 { isFlatRecord, isPlainRecord } from "#core/predicates/record.predicate";
import type { ApiNote } from "#types/readme.types";

export const isNonEmptyString = function isNonEmptyString(value: unknown): value is string {
    return typeof value === "string" && value.trim().length > 0;
};

export const isStringArray = function isStringArray(value: unknown): boolean {
    return Array.isArray(value) && value.length > 0 && value.every(isNonEmptyString);
};

const isFlatRecordArray = function isFlatRecordArray(value: unknown): boolean {
    return Array.isArray(value) && value.length > 0 && value.every(isFlatRecord);
};

export const isRenderable = function isRenderable(value: unknown): boolean {
    return isNonEmptyString(value) || isStringArray(value) || isFlatRecordArray(value);
};

export const isApiNote = function isApiNote(value: unknown): value is ApiNote {
    return isPlainRecord(value) && typeof value["note"] === "string";
};
```
