// Attribute getter export function attr( name: K, ): >(obj: O) => O[K] { return (obj) => obj[name]; } type DefinedKeys = ({ [P in keyof T]: T[P] extends undefined ? never : P })[keyof T]; type Defined = Pick>; // Removes undefined values from objects export function defined(obj: T): Defined { return Object.fromEntries( Object.entries(obj).filter(([_, value]) => typeof value !== "undefined"), ) as any; } // Apply options to a default object export function options( defaults: T, ...options: Partial[] ) { for (let opts of options) { defaults = { ...defaults, ...defined(opts) }; } return defaults; }