@zeix/ui-element
Version:
UIElement - minimal reactive framework based on Web Components
102 lines (85 loc) • 2.65 kB
text/typescript
import { isDefinedObject, isString } from "./util"
/* === Types === */
type LogLevel = 'debug' | 'info' | 'warn' | 'error'
/* === Constants === */
const DEV_MODE = process.env.DEV_MODE
const LOG_DEBUG: LogLevel = 'debug'
const LOG_INFO: LogLevel = 'info'
const LOG_WARN: LogLevel = 'warn'
const LOG_ERROR: LogLevel = 'error'
/* === Internal Functions === */
/**
* Return selector string for the id of the element
*
* @since 0.7.0
* @param {string} id
* @returns {string} - id string for the element with '#' prefix
*/
const idString = (id: string): string => id ? `#${id}` : '';
/**
* Return a selector string for classes of the element
*
* @since 0.7.0
* @param {DOMTokenList} classList - DOMTokenList to convert to a string
* @returns {string} - class string for the DOMTokenList with '.' prefix if any
*/
const classString = (classList: DOMTokenList): string =>
classList.length ? `.${Array.from(classList).join('.')}` : ''
/* === Exported Functions === */
/**
* Return a HyperScript string representation of the Element instance
*
* @since 0.7.0
* @param {Element} el
* @returns {string}
*/
const elementName = (el: Element): string =>
`<${el.localName}${idString(el.id)}${classString(el.classList)}>`
/**
* Return a string representation of a JavaScript variable
*
* @since 0.7.0
* @param {unknown} value
* @returns {string}
*/
const valueString = (value: unknown): string =>
isString(value) ? `"${value}"`
: isDefinedObject(value) ? JSON.stringify(value)
: String(value)
/**
* Return a detailed type of a JavaScript variable
*
* @since 0.11.0
* @param {unknown} value
* @returns {string}
*/
const typeString = (value: unknown): string => {
if (value === null) return 'null'
if (typeof value !== 'object') return typeof value
if (Array.isArray(value)) return 'Array'
// Check for Symbol.toStringTag
if (Symbol.toStringTag in Object(value)) {
return (value as any)[Symbol.toStringTag]
}
// For other objects, return the constructor name if available
return value.constructor?.name || 'Object'
}
/**
* Log a message to the console with the specified level
*
* @since 0.7.0
* @param {T} value - value to inspect
* @param {string} msg - message to log
* @param {LogLevel} level - log level
* @returns {T} - value passed through
*/
const log = <T>(value: T, msg: string, level: LogLevel = LOG_DEBUG): T => {
if (DEV_MODE || ([LOG_ERROR, LOG_WARN] as LogLevel[]).includes(level))
console[level](msg, value)
return value
}
export {
type LogLevel,
log, elementName, valueString, typeString,
DEV_MODE, LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR
}