Files
recflare/packages/hono-helpers/src/helpers/env.ts
T
2026-09-27 23:02:42 -04:00

50 lines
2.0 KiB
TypeScript

/**
* Read an integer worker var, falling back to `fallback` when it is unset or unusable.
*
* A var arrives as a number when it's declared in wrangler.jsonc `vars`, but as a string
* when it's set anywhere else (the dashboard, `wrangler deploy --var`, `.dev.vars`), so
* both have to be accepted — the same var is a different type depending on where the
* operator set it.
*
* Anything that isn't a finite integer (an empty string, a typo, `3.5`) is treated as
* unset rather than coerced: `Number.parseInt` would read `"3abc"` as 3 and `"3.9"` as 3,
* which turns a typo into a silently wrong limit. Falling back to the documented default
* is the safe failure here.
*/
export function intVar(value: unknown, fallback: number): number {
if (typeof value === 'number') return Number.isInteger(value) ? value : fallback
if (typeof value !== 'string' || value.trim() === '') return fallback
const parsed = Number(value)
return Number.isInteger(parsed) ? parsed : fallback
}
/**
* Read an on/off worker var, falling back to `fallback` when it is unset or unusable.
*
* Accepts the spellings an operator plausibly types — `on`/`off`, `true`/`false`,
* `yes`/`no`, `1`/`0`, in any case — plus a real boolean or number, since a var declared
* in wrangler.jsonc `vars` keeps its JSON type while one set with `--var` is a string (see
* `intVar`). Anything else (an empty string, `enabled`, a typo) is treated as unset rather
* than read as true or false: a switch that guards something sensitive must not flip on a
* misspelling, so the documented default is the safe failure.
*/
export function flagVar(value: unknown, fallback: boolean): boolean {
if (typeof value === 'boolean') return value
if (typeof value === 'number') return value === 1 ? true : value === 0 ? false : fallback
if (typeof value !== 'string') return fallback
switch (value.trim().toLowerCase()) {
case 'on':
case 'true':
case 'yes':
case '1':
return true
case 'off':
case 'false':
case 'no':
case '0':
return false
default:
return fallback
}
}