(
value: number | string | undefined | null,
fallback: number,
options: { min?: number; integer?: boolean } = {}
)
| 604 | * type at the boundary instead of relying on JS implicit coercion. |
| 605 | */ |
| 606 | export function envNumber( |
| 607 | value: number | string | undefined | null, |
| 608 | fallback: number, |
| 609 | options: { min?: number; integer?: boolean } = {} |
| 610 | ): number { |
| 611 | const min = options.min ?? 0 |
| 612 | if ( |
| 613 | typeof value === 'number' && |
| 614 | Number.isFinite(value) && |
| 615 | value >= min && |
| 616 | (!options.integer || Number.isInteger(value)) |
| 617 | ) { |
| 618 | return value |
| 619 | } |
| 620 | if (value === undefined || value === null || value === '') return fallback |
| 621 | const parsed = Number(value) |
| 622 | return Number.isFinite(parsed) && parsed >= min && (!options.integer || Number.isInteger(parsed)) |
| 623 | ? parsed |
| 624 | : fallback |
| 625 | } |
| 626 | |
| 627 | /** |
| 628 | * Coerce an env-derived value to a boolean. Returns `undefined` when unset |
no outgoing calls
no test coverage detected