import { definePrivateConstant } from '../object/definePublicConstant.js'; export interface NamedObject { displayName: string; } /** * Get displayName/name of a object */ export function objectName(func: NonNullable) { return (func as MaybeNamed).displayName || (func as MaybeNamed).name; } /** * Set displayName of a object */ export function nameObject(name: string, object: T): T & NamedObject { if (typeof object === 'function') { definePrivateConstant(object, 'name', name); } else if ('name' in object) { definePrivateConstant(object, 'displayName', name); } else { definePrivateConstant(object, 'name', name); } definePrivateConstant(object, Symbol.toStringTag, `${object.constructor.name}: ${name}`); return object as any; } export interface MaybeNamed { readonly name?: string; readonly displayName?: string; } /** * Assert function must have oneof displayName/name property */ export function assertObjectHasName(func: NonNullable): asserts func is T & NamedObject { if (!(func as MaybeNamed).displayName && !(func as MaybeNamed).name) { console.error(func); throw new TypeError('object must have name!'); } } /** * Function with displayName */ export interface NamedFunction extends Function { displayName: string; } /** * Function with displayName */ export interface MaybeNamedFunction extends Function { displayName?: string; } /** like objectName but return */ export function functionName(func: Function) { return objectName(func) || ''; } /** @deprecated use nameObject */ export const nameFunction = nameObject; /** @deprecated use assertObjectHasName */ export const assertFunctionHasName = assertObjectHasName;