UNPKG

veffect

Version:

powerful TypeScript validation library built on the robust foundation of Effect combining exceptional type safety, high performance, and developer experience. Taking inspiration from Effect's functional principles, VEffect delivers a balanced approach tha

115 lines (104 loc) 2.06 kB
/** * @since 2.0.0 */ import { hasProperty, isFunction } from "./Predicate.js" /** * @since 2.0.0 * @category symbols */ export const NodeInspectSymbol = Symbol.for("nodejs.util.inspect.custom") /** * @since 2.0.0 * @category symbols */ export type NodeInspectSymbol = typeof NodeInspectSymbol /** * @since 2.0.0 * @category models */ export interface Inspectable { toString(): string toJSON(): unknown [NodeInspectSymbol](): unknown } /** * @since 2.0.0 */ export const toJSON = (x: unknown): unknown => { if ( hasProperty(x, "toJSON") && isFunction(x["toJSON"]) && x["toJSON"].length === 0 ) { return x.toJSON() } else if (Array.isArray(x)) { return x.map(toJSON) } return x } /** * @since 2.0.0 */ export const format = (x: unknown): string => JSON.stringify(x, null, 2) /** * @since 2.0.0 */ export const BaseProto: Inspectable = { toJSON() { return toJSON(this) }, [NodeInspectSymbol]() { return this.toJSON() }, toString() { return format(this.toJSON()) } } /** * @since 2.0.0 */ export abstract class Class { /** * @since 2.0.0 */ abstract toJSON(): unknown /** * @since 2.0.0 */ [NodeInspectSymbol]() { return this.toJSON() } /** * @since 2.0.0 */ toString() { return format(this.toJSON()) } } /** * @since 2.0.0 */ export const toStringUnknown = (u: unknown, whitespace: number | string | undefined = 2): string => { try { return typeof u === "object" ? stringifyCircular(u, whitespace) : String(u) } catch (_) { return String(u) } } /** * @since 2.0.0 */ export const stringifyCircular = (obj: unknown, whitespace?: number | string | undefined): string => { let cache: Array<unknown> = [] const retVal = JSON.stringify( obj, (_key, value) => typeof value === "object" && value !== null ? cache.includes(value) ? undefined // circular reference : cache.push(value) && value : value, whitespace ) ;(cache as any) = undefined return retVal }