UNPKG

@zeix/ui-element

Version:

UIElement - minimal reactive framework based on Web Components

91 lines (80 loc) 2.64 kB
import { log, LOG_ERROR } from '../core/log' /* === Internal Function === */ const parseNumber = (parseFn: (v: string) => number, value: string | null): number | undefined => { if (value == null) return const parsed = parseFn(value) return Number.isFinite(parsed) ? parsed : undefined } const getFallback = <T extends {}>(value: T | [T, ...T[]]): T => (Array.isArray(value) && value[0]) ? value[0] as T : value as T /* === Exported Functions === */ /** * Parse a boolean attribute as an actual boolean value * * @since 0.7.0 * @param {string} value - maybe string value * @returns {boolean} */ const asBoolean = (value: string | null): boolean => value !== 'false' && value != null /** * Parse an attribute as as number forced to integer with a fallback * * @since 0.11.0 * @param {number} [fallback=0] - fallback value * @returns {(value: string | null) => number} - parser function */ const asInteger = (fallback: number = 0) => (value: string | null): number => parseNumber(parseInt, value) ?? fallback /** * Parse an attribute as as number with a fallback * * @since 0.11.0 * @param {number} [fallback=0] - fallback value * @returns {(value: string | null) => number} - parser function */ const asNumber = (fallback: number = 0) => (value: string | null): number => parseNumber(parseFloat, value) ?? fallback /** * Parse an attribute as a string with a fallback * * @since 0.11.0 * @param {string} [fallback=''] - fallback value * @returns {(value: string | null) => string} - parser function */ const asString = (fallback: string = '') => (value: string | null): string => value ?? fallback /** * Parse an attribute as a multi-state value (for examnple: true, false, mixed), defaulting to the first valid option * * @since 0.9.0 * @param {string[]} valid - array of valid values * @returns {(value: string | null) => string} - parser function */ const asEnum = (valid: [string, ...string[]]) => (value: string | null): string => (value != null && valid.includes(value.toLowerCase())) ? value : getFallback<string>(valid) /** * Parse an attribute as a JSON serialized object with a fallback * * @since 0.11.0 * @param {T} fallback - fallback value * @returns {(value: string | null) => T} - parser function */ const asJSON = <T extends {}>(fallback: T) => (value: string | null): T => { if (value == null) return fallback let result: T | undefined try { result = JSON.parse(value) } catch (error) { log(error, 'Failed to parse JSON', LOG_ERROR) } return result ?? fallback } export { asBoolean, asInteger, asNumber, asString, asEnum, asJSON }